此问题在此处已有答案:
Is the Promise constructor callback executed asynchronously?(2个答案)
When is the body of a Promise executed?(4个答案)
19小时前关门了。
我读了关于事件循环和回调队列和微/宏任务队列,但也许我得到了一些错误的方式,有人能为我可视化吗?,它将帮助我理解这么多的概念。
console.log(1)
const wait2sec = new Promise((resolve, reject) => {
console.log(2)
setTimeout(() => {
console.log(3)
resolve(true)
}, 2000)
console.log(4)
})
const X =async () => {
await wait2sec
console.log('ok')
}
X()
console.log(5)
我认为它应该记录:1、5、2、4、3,可以,但它记录:一,二,四,五,三,好
2条答案
按热度按时间toiithl61#
从MDN(强调我的):
异步函数的主体可以被看作是由零个或多个await表达式分割的。**顶层代码,直到并包括第一个await表达式(如果有),都是同步运行的。**这样,没有await表达式的异步函数将同步运行。但是,如果函数主体中有await表达式,异步函数将总是异步完成。
这就是这里发生的事情,
X
和wait2sec
的代码同步运行,因此在console.log(5)
之前运行。yduiuuwa2#
您预期Promise对象和console.log之间会出现并发行为,但没有看到?
1.您创建并立即调用了Promise对象(因此您看不到5在2,4之前,至少声明wait2sec为函数)。
1.没有await或timeout的Promise对象作为一个同步函数运行(因此您看到2、4和3之后的函数)
如果你想看到两个进程之间的并发性,请看下面的代码: