Javascript等待不等待?



我有多个异步函数,我想一个接一个地执行,但是下一个函数在前一个函数完成之前执行。

async function x() {
for (...) {
console.log("awaiting" + i)
function fooPromise() {
return new Promise(function(resolve) {
foo();
resolve();
});
}
await fooPromise();
console.log("awaited" + i)
}
}
async foo(){
for(...){
await sleep(1500);    
}    
console.log("finished");
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

期望的输出应该是:

awaited1
finished
awaited1
awaited2
finished
awaited3
finished
awaited3

但是我得到的却是:

waiting1
awaited1
awaited2
awaited2
awaited3
awaited3
finished
finished
finished
finished
finished

我对使用promise和async相当陌生,所以任何帮助都会很感激。

return new Promise(function(resolve) {
foo();
resolve();
});

传递给promise构造函数的代码会立即同步运行。构造函数通常用于接收使用回调函数编写的代码,然后将回调函数包装在承诺中(就像在sleep示例中一样)。

所以这段代码会立即调用foo,忽略foo返回的promise,然后立即解析新的promise。事实上,foo稍后做的事情对这个承诺没有影响。

因为foo已经返回一个承诺(因为它是一个异步函数),没有必要把它包装在一个新的。您可以将代码更改为:

async function x() {
for (let i = 1; i <= 3; i++) {
console.log("awaiting" + i);
await foo();
console.log("awaited" + i);
}
}
async function foo() {
for(let i = 1; i <= 2; i++){
await sleep(1500);    
} 
console.log("finished");
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
x();

最新更新