连锁无限承诺

问题描述 投票:0回答:1

我正在尝试从一个经常被调用并且需要尽快返回的函数进行(昂贵的)计算。计算本身不需要很快完成,更重要的是计算相继发生。

我有将 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
链接在一起可以实现这一点。

javascript asynchronous promise chaining
1个回答
0
投票

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');
})();

© www.soinside.com 2019 - 2024. All rights reserved.