gpt4 book ai didi

node.js - Nodejs Promise 异步等待顺序执行

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:10 25 4
gpt4 key购买 nike

如何让 demo() 顺序执行。

demo()

async function demo() {
doAll()
console.log("I DO NOT print sequentially");
}

async function doAll() {
var number = await getNumber();
var double = await doubleWithTimeout(number);
console.log(number,double)
}

async function getNumber() {
return new Promise(function(resolve, reject) {
var a = 2;
resolve(a);
});
}

async function doubleWithTimeout(x) {
return new Promise(function(resolve, reject) {
setTimeout(() => {
resolve(x * 2);
}, 2 );
});
}

结果:
我不按顺序打印
2 4

预期结果:
2 4
我确实按顺序打印

我希望我能摆脱下面的代码,但你不能在 promise 中等待:

async function demo() {
await doAll()
console.log("i execute without waiting");
}

async function doAll() {
return new Promise(function(resolve, reject) {
var number = await getNumber();
var double = await doubleWithTimeout(number);
console.log(number, double)
});
}

最佳答案

只需使用原始代码并将 await 放在 doAll(); 前面:

demo()

async function demo() {
await doAll(); // Added await here
console.log("I DO NOT print sequentially");
}

async function doAll() {
var number = await getNumber();
var double = await doubleWithTimeout(number);
console.log(number,double)
}

async function getNumber() {
return new Promise(function(resolve, reject) {
var a = 2;
resolve(a);
});
}

async function doubleWithTimeout(x) {
return new Promise(function(resolve, reject) {
setTimeout(() => {
resolve(x * 2);
}, 2 );
});
}

每个声明为async的函数(包括doAll)都会返回一个Promise。如果函数体返回 Promise 以外的内容,例如返回 undefined 的 doAll,则该值将通过异步声明包装在立即解析的 Promise 中。

顺便说一句,你说“但是你不能在 promise 中等待”,这是不正确的。您不能在非异步函数中使用await。如果你想在 Promise 构造函数回调中使用 wait,只需将其声明为 async:

return new Promise(async function(resolve, reject) {

});

关于node.js - Nodejs Promise 异步等待顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50162735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com