我一直在研究promise 、等待和异步功能.当我刚刚处于学习promise 的阶段时,我偶然发现了这一点:

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

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

推荐答案

在您询问的特定序列(从***)的执行中不涉及微任务,尽管微任务在该序列期间获得queued(然后稍后运行).

一个async函数在第一个awaitreturn之前是同步的(包括一个隐式返回,其中代码执行只是"脱离"函数的结尾).此时,该函数返回一个Promise,同步执行从调用该函数的位置继续.如果它是return或隐式返回(不是await),则微任务排队以解决来自函数的promise .

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

The code from the question, with highlighting on: 1. async1 and async2's empty parameter lists, the first console.log in each, and (in async1) the call to async2() but not the await on it; 2. The two statements at the end that aren't in any function.

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

在该特定示例中,在***个部分之间,用于实现async2的promise 的微任务被排队.当执行您示例中的同步代码的任务完成时,该微任务从微任务队列中提取并执行-这解决了正在等待它的async1的promise ;async1的代码继续,执行其日志(log),然后隐式返回,因此微任务排队处理该结算(在本例中为履行),并在async2微任务执行完成后从微任务队列中提取.但没有任何事情等待这一promise ,因此和解协议不会产生任何明显的效果.

Javascript相关问答推荐

如何从调整大小/zoom 的SVG路径定义新的d属性?""

屏幕右侧屏障上的产卵点""

如何调用名称在字符串中的实例方法?

在带有背景图像和圆形的div中添加长方体阴影时的重影线

用于编辑CSS样式的Java脚本

如何在输入元素中附加一个属性为checkbox?

如何在Bootstrap中减少网格系统中单个div的宽度

变量在导入到Vite中的另一个js文件时成为常量.

使用线性插值法旋转直线以查看鼠标会导致 skip

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

AG-GRIDreact 显示布尔值而不是复选框

是否设置以JavaScript为背景的画布元素?

连续添加promise 时,如何在所有promise 都已结算时解除加载覆盖

AstroJS混合模式服务器终结点返回404

将以前缓存的 Select 器与querySelector()一起使用

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?

由于http.get,*ngIf的延迟很大

如何按区域进行过滤并将其从结果数组中删除?

Qualtrics联合实验脚本随机化条件

RXJS相依可观量