gpt4 book ai didi

javascript - 编写异步/等待版本的 promise

转载 作者:行者123 更新时间:2023-12-03 07:18:35 24 4
gpt4 key购买 nike

下面的代码按预期每秒记录一次“hello world”。

function moveOneStep() {
return new Promise((res, rej) => {
setTimeout(() => {
res(console.log('Hello world!'))
}, 1000)
})
}

async function main() {
await moveOneStep();
await moveOneStep();
await moveOneStep();
await moveOneStep();
}

考虑到 async 函数的 return 值对应于 promise 中 resolve 函数的返回值,为什么下面的代码没有输出相同的结果,但一次记录所有的“hello world”:

async function moveOneStepAsync() {
setTimeout(() => {
return console.log('Hello world!');
}, 1000);
}

async function main() {
await moveOneStepAsync();
await moveOneStepAsync();
await moveOneStepAsync();
await moveOneStepAsync();
}

最佳答案

那是因为 setTimeout 没有在您的 main 函数中返回对 await 的 promise 。 setTimeout 本身同步执行。它将作为参数传递的回调添加到事件循环中,以便及时执行。

此外,在此代码中,回调的返回没有任何意义,因为回调会在 1 秒内运行,并且返回的值将无处可去。

async 关键字告诉您函数返回 promise 并且可以在其中包含 awaitable 代码。因此,由于您的代码中没有 await 它看起来像

function moveOneStepAsync() {
setTimeout(() => {
return console.log('Hello world!');
}, 1000);
return Promise.resolve();
}

因此您在 main 中的 await 将等待一个事件循环滴答以转到下一个“步骤”

阅读有关 setTimeout、事件循环以及 await 期望更深入理解它的内容

关于javascript - 编写异步/等待版本的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54206147/

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