如何从使用then()

时间:2018-03-14 17:07:15

标签: reactjs asynchronous promise

所以我正在编写一个代码框架,用于创建一个反应应用程序。有一个看起来像这样的功能:

this.asyncFunction = function () {
    const url = 'https://api.com/stuff/get'
    return fetch(url, httpOptions)
    .then(processResponse)
      .catch(handleError)
}

它像这样被调用

model.asyncFunction().then(stuff => {
    this.setState({
      status: 'LOADED',
      stuff: stuff
    })
  }).catch(() => {
    this.setState({
      status: 'ERROR'
    })
  })

我的问题(我不确定如何谷歌)我想缓存结果,如果它被缓存,我想得到那个。我尝试了我认为最明显的事情:

this.asyncFunction = function () {
    if(cached){
       return cachedResult;
    }
    const url = 'https://api.com/stuff/get'
    return fetch(url, httpOptions)
    .then(processResponse)
      .catch(handleError)
}

(并将cachedResult存储在processResponse函数中)

现在这不起作用,我得到

TypeError: ... asyncFunction(...).then is not a function

现在,从谷歌我了解到这是因为asyncFunction应该返回一个承诺(因为我们称之为"然后")。什么是正确的方式"这样做?

有点假设这是某种形式的重复但不确定如何找到它。我已经尝试过使用resolve创建一个promise,但看起来只返回undefined。

1 个答案:

答案 0 :(得分:4)

我认为你可以做到以下几点:

this.asyncFunction = function () {
    if(cached){
       return Promise.resolve(cachedResult);
    }
...etc

来自the docs

  

Promise.resolve(value)方法返回一个Promise对象   用给定的值解决。如果该值是可以的(即具有a   “然后”方法),返回的承诺将“跟随”那个,   采用其最终状态;如果值是一个承诺,那个对象   成为Promise.resolve调用的结果;否则   返回的承诺将通过价值来实现。

在您的场景中,您正在返回一个对象,因此它将返回一个将使用给定对象解析的Promise对象。