Javascript promise 停留在挂起状态

标签 javascript promise

我是 Javascript 的新手,怀疑我犯了一个基本错误。我想按顺序运行一个循环,但我使用的是 promises,它们停留在“待定”状态。

function print(i){
    return new Promise(function(resolve,reject){
      console.log(i);
      resolve();
    });
}

counter = 0;
var sequence = Promise.resolve();

// The real while loop is much more complicated than this
while (counter < 10) {
    sequence = sequence.then(function() {
      print(counter);
    }).then(function() {
      counter += 1;
    });
}

我的问题与this question 非常相似, 除了我仍然陷入挂起状态,即使我调用了 resolve()。我做错了什么?

最佳答案

您有两个问题。一个更简单的方法是您不会返回 print 的结果,因此您永远不会等待 promise 解决后再继续。

更大的问题是您的 while 循环试图将同步循环与 promises 结合起来。基本上,您的 while 循环伪代码如下所示:

while counter < 10:
  spawn an async task
end

由于 counter 仅在您的异步任务中递增,因此 while 循环永远不会结束。更重要的是,由于您的 while 循环永不停止,您的异步任务永远不会启动,因为 javascript 是单线程的。

您可以使用 await 解决此问题,如下所示:

function print(i) {
  return new Promise(function(resolve, reject) {
    console.log(i);
    resolve();
  });
}

async function runLoop() {
  let counter = 0;
  while (counter < 10) {
    const result = await print(counter);
    counter += 1;
  }
}

runLoop().then(() => {
  console.log('done');
});

关于Javascript promise 停留在挂起状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922202/

相关文章:

javascript - 如何在 iOS 上取消双击滚动手势?

javascript - meteor JS : Handling an async function inside another async function?

javascript - 如何在每个循环中等待一个 promise ?

javascript - 日志记录时避免 Promise 构造函数反模式

javascript - 选择单选按钮不是事件?

javascript - 无法删除动态创建的 Div

php - 通过网页抓取提取 JavaScript 变量值

javascript - 使用 sinon 和 bluebird 对 Promisified 函数进行 Stub

javascript - 如何简化 Q promise 示例

javascript - 回调函数返回未定义?