我是 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/