【问题标题】:Sharing a promise (in Redux state.)共享一个承诺(在 Redux 状态下。)
【发布时间】:2017-01-01 23:16:08
【问题描述】:

我有一个函数依赖于从异步操作(API 获取)中解析的 Promise。

异步操作需要返回 Fetch 承诺,或者返回在 Fetch 完成时解析的承诺。

但是,Fetch 应该只发生一次。

我可以将 fetch 承诺存储在一个全局变量中,然后返回它,但这是 Redux 中的反模式吗? Promise 是否应该在 Redux 存储中,因为它是应用程序状态的一部分?

示例代码:

//Should this be in Redux Store?
var promise = null;

myfunction() {
  doAsyncTask().then(() => {
    //Continue
  });
}

doAsyncTask() {
  if(promise === null) {
    promise = fetch('URI');
  }
  return promise;
}

【问题讨论】:

  • 你不需要知道。在第一次调用函数时缓存 promise,并始终返回缓存的 promise。顺便提一句。为什么你需要延迟调用fetch('URI')(doAsyncTask())?为什么不首先调用它,保存 promise 并使用它而不是调用 doAsyncTask()?
  • 感谢您的回复,isFetching 标志在 Redux Store 中,您是否也将 Promise 存储在其中?
  • 不知道我对 redux 几乎没有经验。想到两个问题:它是什么样的商店?它可以处理承诺,还是需要可序列化的数据?第二个想法:你需要这个承诺多久?那是在这段时间内存储数据的正确位置吗?例如,如果它是一个全局存储,并且您只需要一个模块的承诺,那么可能会有一个更好的地方来存储它。但如前所述,这里有一些在 redux 方面有更多经验的开发人员可以为您提供这个问题的正确答案。
  • 它是一个对象存储,所以我认为它可以存储一个承诺。我同意你关于持续时间的观点,这就是为什么我不愿意将它存储在 Redux 中。但是,它是应用程序状态的一部分,在商店之外拥有状态感觉就像是一种反模式。为了回答您之前的评论,呼叫被延迟以防止污染 myFunction 因为必须处理获取的数据等。谢谢
  • 问题类似于stackoverflow.com/a/18745499/6757219 但真正的问题是在 Redux 状态容器的上下文中将“dataPromise”存储在哪里。

标签: javascript redux


【解决方案1】:

这是一个简单的方法来缓存一个承诺,或者基本上是一个函数产生的任何计算,所以当再次调用函数时(在第一次之后)它会返回最后一个计算值,在下面的例子中总是**相同* 承诺(已解决待处理)。

根据您的特定需求,您可以将 Promise 替换为 fetch 并将其存储在 cache 变量中。

function myfunction(){
  doAsyncTask().then(RES => {
    console.log(RES);
  });
}

const doAsyncTask = (cache => {
  return function(){
    // when called first time, put the promise in the "cache" variable
    if( !cache ){
        cache = new Promise(function(resolve, reject){
            setTimeout(() => {
                resolve('foo');
            }, 2000);
        });
    }
    return cache;
  }
})();

myfunction(); 
myfunction(); // second call uses the exact same promise

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多