async/await 中的执行顺序

7 javascript asynchronous async-await

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

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

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


async1();
console.log('Synchronous'); //**
Run Code Online (Sandbox Code Playgroud)

结果是:

Async 1
FROM async 2
Synchronous
AFter Async 1
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 16

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

\n

函数async是同步的,直到出现第一个await未捕获的异常,或者return(包括代码执行“脱离”函数末尾的隐式返回)。此时,该函数返回一个 Promise,并且从调用该函数的位置继续同步执行。如果它是异常或return隐式返回(不是await),则微任务将排队以解决函数的承诺(在异常时拒绝它或在返回时履行它)。

\n

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

\n

问题中的代码,突出显示: 1. async1 和 async2 的空参数列表,每个中的第一个 console.log,以及(在 async1 中)对 async2() 的调用,但不对其进行等待; 2. 末尾的两条语句不在任何函数中。

\n

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

\n

在这个特定的示例中,在*和部分之间,用于履行 \ 承诺**的微任务排队。async2当示例中执行同步代码的任务完成时,将从微任务队列中选取该微任务并执行\xc2\xa0\xe2\x80\x94,并解决等待它的承诺async1async1\ 的代码继续,执行其日志,然后隐式返回,因此微任务排队以处理该结算(在本例中为履行),并在微任务async2执行完成后从微任务队列中获取。但没有什么等待这一承诺,因此和解协议没有产生任何明显的效果。

\n