[英]Asynchronous Execution Order in JavaScript
我不明白为什么执行 output 后是1 3 4 2 6 5
;
Promise.resolve().then(() => console.log(2)); (async() => console.log(await 6))(); console.log(1); (async() => await console.log(3))(); Promise.resolve().then(() => console.log(5)); console.log(4);
以下是您的代码的执行方式:
Promise.resolve()
创建一个已解析的 promise 将() => console.log(2)
放入微任务队列
queue: [ () => console.log(2) ]
IIFE 在其中执行await 6
。 等待 6 类似于将其包装在Promise.resolve(6)
中,然后等待它: await Promise.resolve(6)
。
当await
的操作数不是 promise 时, await
创建一个原生的 promise 并使用操作数的值来解析 promise
queue: [ resolve(6), () => console.log(2) ]
1
登录到控制台
queue: [ resolve(6), () => console.log(2) ] console output: 1
第二个 IIFE 在您await console.log(3)
的地方执行。 这就像await undefined
因为console.log(3)
将执行, 3
将被记录在控制台上并且console.log
的返回值,即undefined
将被等待。
简而言之,您正在等待undefined
。
queue: [ resolve(undefined), resolve(6), () => console.log(2) ] console output: 1 3
Promise.resolve()
创建一个已解析的 promise 将() => console.log(5)
放入微任务队列
queue: [ () => console.log(5), resolve(undefined), resolve(6), () => console.log(2) ] console output: 1 3
4
登录到控制台
queue: [ () => console.log(5), resolve(undefined), resolve(6), () => console.log(2) ] console output: 1 3 4
脚本执行结束
事件循环现在将开始处理微任务队列
2
将在控制台上登录,因为它先排队
queue: [ () => console.log(5), resolve(undefined), resolve(6) ] console output: 1 3 4 2
await 6
解析为值6
,然后传递给console.log
。 结果6
被记录在控制台上
queue: [ () => console.log(5), resolve(undefined) ] console output: 1 3 4 2 6
Promise 由于await console.log(3)
解析为undefined
的值
queue: [ () => console.log(5) ] console output: 1 3 4 2 6
5
登录到控制台
queue: [ ] console output: 1 3 4 2 6 5
完毕。
注意:您的代码不应依赖于解决不同的不相关承诺的时间和顺序。
这里有两个序列: 1 3 4
和2 6 5
。 第一个是在第一个 tick 上产生的(在任何 promises 已经解决之前,第二个是在第二个 tick 上(在 promise 决议之后)。
(async() => await console.log(3))();
在 await 之前将3
写入日志,因此3
出现在任何承诺解决之前,并且由于语句的顺序而出现在 1 和 4 之间。 (请注意,此行中的await
解析为undefined
,因为 console.log 不返回任何内容)。
对于序列2 6 5
,所有控制台日志都出现在 promise 解析之后(或者,等效地,await 语句),否则它们按自然顺序排列。
由于执行顺序,首先打印 1。 3 在执行代码时打印,因为console.log()
不是异步操作。 如果你把 await 放在它前面也没关系。 4 由于执行顺序再次打印。
现在,rest的执行顺序是由于异步操作。 以上3条语句执行完毕后,异步打印3条语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.