繁体   English   中英

JavaScript中的异步执行顺序

[英]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);

以下是您的代码的执行方式:

  1. Promise.resolve()创建一个已解析的 promise 将() => console.log(2)放入微任务队列

    queue: [ () => console.log(2) ]
  2. IIFE 在其中执行await 6 等待 6 类似于将其包装在Promise.resolve(6)中,然后等待它: await Promise.resolve(6)

    await的操作数不是 promise 时, await创建一个原生的 promise 并使用操作数的值来解析 promise

     queue: [ resolve(6), () => console.log(2) ]
  3. 1登录到控制台

    queue: [ resolve(6), () => console.log(2) ] console output: 1
  4. 第二个 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
  5. Promise.resolve()创建一个已解析的 promise 将() => console.log(5)放入微任务队列

    queue: [ () => console.log(5), resolve(undefined), resolve(6), () => console.log(2) ] console output: 1 3
  6. 4登录到控制台

    queue: [ () => console.log(5), resolve(undefined), resolve(6), () => console.log(2) ] console output: 1 3 4
  7. 脚本执行结束

  8. 事件循环现在将开始处理微任务队列

  9. 2将在控制台上登录,因为它先排队

    queue: [ () => console.log(5), resolve(undefined), resolve(6) ] console output: 1 3 4 2
  10. await 6解析为值6 ,然后传递给console.log 结果6被记录在控制台上

    queue: [ () => console.log(5), resolve(undefined) ] console output: 1 3 4 2 6
  11. Promise 由于await console.log(3)解析为undefined的值

    queue: [ () => console.log(5) ] console output: 1 3 4 2 6
  12. 5登录到控制台

    queue: [ ] console output: 1 3 4 2 6 5
  13. 完毕。


注意:您的代码不应依赖于解决不同的不相关承诺的时间和顺序。

这里有两个序列: 1 3 42 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM