Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缓存从侦听器回调获取的值_Javascript_Es6 Promise - Fatal编程技术网

Javascript 缓存从侦听器回调获取的值

Javascript 缓存从侦听器回调获取的值,javascript,es6-promise,Javascript,Es6 Promise,注意:不适用,因为该问题不涉及在状态发生变化时调用侦听器回调的API(这意味着API存储侦听器函数,并且可以在其状态更新时多次调用它) 我有一个状态对象类型state 现在我有了一个APIAPI.addEventListener(),它接受类型为函数(!State):undefined的侦听器和一个布尔值repeating。如果调用,此API将存储侦听器回调,并在 状态变为可用(从不存在到存在) 如果repeating为true,则新的状态对象变为可用(突变) 最初,每当我调用doStuff

注意:不适用,因为该问题不涉及在状态发生变化时调用侦听器回调的API(这意味着API存储侦听器函数,并且可以在其状态更新时多次调用它)

我有一个状态对象类型
state

现在我有了一个API
API.addEventListener()
,它接受类型为
函数(!State):undefined
的侦听器和一个布尔值
repeating
。如果调用,此API将存储侦听器回调,并在

  • 状态变为可用(从不存在到存在)
  • 如果
    repeating
    为true,则新的
    状态
    对象变为可用(突变)
最初,每当我调用
doStuff()
来执行我的逻辑时,我都会调用
API.addEventListener()
来获取最新的
状态
对象:

/**
*@return{!Promise{!State}
*/
函数getStatePromise(){
返回新承诺(解决=>{
API.addEventListener(解析,/*重复*/false);
});
}
函数doStuff(){
getStatePromise()。然后(状态=>{
//我的逻辑
});
}
doStuff()

现在,我想将从
API.getState()
检索到的结果缓存在JS脚本中的持久对象中,并在新的
状态可用时让代码更新缓存。我不想更改
doStuff()
,因为它相当复杂。是否可以更改
getStatePromise()
来执行此操作

我目前的尝试是:

let cacheStorage={};//或者window.localStorage,但这不是重点
/**
*@return{!Promise{!State}
*/
函数getStatePromise(){
if(cacheStorage.state!==未定义){
返回Promise.resolve(cacheStorage.state);
}
返回新承诺(解决=>{
API.addEventListener(newState=>{
cacheStorage.state=newState;
解析(newState);/??如果侦听器再次被调用怎么办?
},/*重复*/true);
});
}
函数doStuff(){
getStatePromise()。然后(状态=>{
//我的逻辑
});
}
当第一次调用
doStuff()
时,
cacheStorage
为空,因此
getstateconomise()
将获取
状态
对象,填充缓存,并返回解析为
状态
对象的承诺。然后,当第二次调用
doStuff()
时,它将只返回解析为缓存的
状态的承诺

但是,问题是,当新的
状态
稍后可用时,
API
将再次调用侦听器回调,这意味着将再次调用
resolve()
(请参见代码中的
)。这听起来不对,因为它正在解决一个已经解决的承诺。我该如何解决这个问题

编辑:是修复程序吗?

替换

返回新承诺(解析=>{
API.addEventListener(newState=>{
cacheStorage.state=newState;
解析(newState);/??如果侦听器再次被调用怎么办?
},/*重复*/true);
});

返回新承诺(解析=>{
让initialCall=true;
API.addEventListener(newState=>{
cacheStorage.state=newState;
如果(初始呼叫){
解决(新闻状态);
initialCall=false;
}
},/*重复*/true);
});

检查此链接:嘿@MajiD是的,我在发布此链接之前阅读了它。这个问题与我的场景不太一样,因为那篇文章并不担心API在状态突变时调用侦听器。在我的场景中,API存储侦听器,并可能多次调用它。