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