JavaScript队列承诺解析,直到异步调用完成(改进方法)



我发现了一个有趣的算法,我想知道它是否真的有必要,或者是否有改进的方法,因为代码非常混乱。从本质上讲,getValue方法可以在任何时候调用(它是库代码的一部分(,并且有必要保证对服务器的调用只进行一次。如果有人在从服务器加载时需要值,那么承诺应该等到服务器响应。这种情况下的解决方案是在队列中累积方法调用,然后,当服务器调用承诺得到解决时,执行所有累积的内容。

我知道,由于语言的异步性,这样的东西是必要的,但还有更好的东西吗?

演示代码:

function getValueFromServer() {
console.log("get value from server");
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("value");
}, Math.floor(Math.random() * 10));
});
}
var singObj = {
value: "",
working: false,
queue: [],
getValue: function() {
if (!this.working && this.value !== "") {
console.log("not working and value exists");
return value;
}
return new Promise(async(resolve, reject) => {
console.log("queue resolution...");
this.queue.push(resolve);
if (!this.working) {
this.working = true;
this.value = await getValueFromServer();
this.working = false;
this.queue.forEach((f) => {
f(this.value);
});
}
});
}
}
function getValueUsage() {
var result = Promise.allSettled([singObj.getValue(), singObj.getValue(), singObj.getValue()]);
console.log(result);
var result = Promise.allSettled([singObj.getValue(), singObj.getValue(), singObj.getValue()]);
console.log(result);
}
getValueUsage();

这确实可以做得简单得多。promise已经永远保持其结果值,您可以多次对同一个promise调用.then()。所以你所需要做的就是

var singObj = {
promise: null,
getValue: function() {
if (!this.promise)
this.promise = getValueFromServer();
return this.promise;
}
};

最新更新