【问题标题】:order of execution in async/awaitasync/await 中的执行顺序
【发布时间】:2022-08-14 14:16:49
【问题描述】:

我一直在研究 promise、await 和 async 函数。当我刚刚处于学习承诺的阶段时,我偶然发现了这个:

async function async1(){
  console.log(\'Async 1\');
  await func2();  // *
  console.log(\'AFter Async 1\');
}

async function async2(){
  console.log(\'FROM async 2\');
}


async1();
console.log(\'Synchronous\'); //**

结果如下:

Async 1
FROM async 2
Synchronous
AFter Async 1

代码如何从 * 跳转到 **。这里如何使用微任务?

    标签: javascript asynchronous async-await


    【解决方案1】:

    前言:在您的代码中,您调用的是func2,但您的代码中没有func2,因此会引发错误。对于这个答案的其余部分,我假设func2 实际上是async2,因为这符合您所看到的输出。 (不过,我没有修复屏幕截图。)


    执行您询问的特定序列(从* 到**)不涉及微任务,尽管微任务排队在该序列期间(然后稍后运行)。

    async 函数在第一个 await 或 return 之前是同步的(包括一个隐式返回,其中代码执行只是“脱离”函数的末尾)。此时,该函数返回一个 Promise,并且同步执行从调用该函数的点继续。如果它是return 或隐式返回(不是await),则会将微任务排队以解决函数的承诺。

    我用黄色突出显示了该代码的同步部分:

    在您的示例中,当您在底部调用async1 时,其同步部分运行(记录Async 1,然后调用async2,其中记录FROM async 2它的同步部分);运行 async2 并从中获得承诺后,async1 到达 await 并返回自己的承诺;然后在您调用它之后继续同步执行,记录Synchronous。

    在这个特定的示例中,在* 和** 部分之间,一个用于履行async2 承诺的微任务被排队。当您的示例中执行同步代码的任务完成时,该微任务将从微任务队列中提取并执行——这将解决来自等待它的async1 的承诺; async1 的代码继续,记录它的日志,然后隐式返回,因此微任务排队处理该结算(在本例中为履行),并在 async2 微任务执行完成后从微任务队列中提取。但是没有什么在等待那个承诺,所以和解没有任何明显的效果。

    【讨论】:

    • 非常翔实的答案...来自 OP 的代码实际上应该是 await async2(); 而不是 await func2(); 在 async1 函数的主体中。否则FROM async 2给定 OP 中的代码,将永远不会记录到控制台,因为按原样,永远不会调用 async2 函数。
    • @RobC - 大声笑,我读过了!你当然是对的。我会添加一个注释。
    猜你喜欢
    • 2018-12-15
    • 2020-04-13
    • 2021-09-30
    • 2018-06-25
    • 2019-07-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多