我有多个异步函数,我想一个接一个地执行,但是下一个函数在前一个函数完成之前执行。
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();