我正在尝试从一个经常被调用并且需要尽快返回的函数进行(昂贵的)计算。计算本身不需要很快完成,更重要的是计算相继发生。
我有将 Promise 与
this
链接在一起的想法,以下似乎可行,但我不确定这是否是一个不好的方法:
let promiseChain = Promise.resolve();
function func() {
(async () => {
promiseChain = promiseChain.then(() => {
doComputation(); // returns nothing
});
})();
}
(编辑)
更多细节:
我正在写的
func
实际上看起来更像是这样的:
function func() { // gets called everytime the DOM changes
const node = capture(document); // Essentially this clones the DOM
(async () => {
promiseChain = promiseChain.then(() => {
doComputation(node); // returns nothing
});
})();
}
func
需要这么快退出的原因是DOM更改可能会快速连续发生,而我想捕获所有更改。这就是为什么我认为通过异步运行其内容来快速退出 func
可能会解决这个问题。计算本身可以是同步的(并且需要按顺序),我认为将它们与 then
链接在一起可以实现这一点。
JS 是单线程语言。您不能在主线程上以异步方式进行同步计算。所以你的承诺链在这种特殊情况下没有意义。您可以只使用普通的同步代码,例如循环执行它们的计算函数。
如果您想执行一系列异步任务,您可以使用
async/await
循环遍历它们。
如果你想在不阻塞 UI 的情况下进行昂贵的计算,请使用 Web Worker: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
let taskId = 1;
const task = async () => new Promise(resolve => setTimeout(() => console.log('finished task ' + taskId++) || resolve(), 3000 * Math.random()));
(async () => {
while(taskId <= 5){
await task(); // this should be replaced with a calculation in a web worker
}
console.log('finished the task chain');
})();