在JavaScript的异步代码执行时:promise
若是遇到await,就将await执行后,后面的代码放入等待队列(由于async和await的本质仍是promise的运用,返回的是一个promise对象)。bash
备注:async是generator的语法糖, 只是把generator的function后面的*换成了前面的async,把yield换成了await。运行原理是同样的,都是为了解决JS的异步操做问题,毕竟JS是单线程的。异步
若是遇到promise的then和catch,也一样放入等待队列,两者优先级相同,在同步代码结束后按照队列的先入先出原则执行。async
若是遇到setTimeout的话,也是一样放在等待队列,可是是不一样的等待队列,优先级低于await和promise。函数
async function async1() {
console.log("async1 start");
await async2(); // 关键点1
console.log("async1 end");
}
async function async2() {
console.log( 'async2');
}
console.log("script start");
setTimeout(function () {
// 关键点2
console.log("settimeout");
},0);
async1();
new Promise(function (resolve) {
console.log("promise1");
// 关键点3
resolve();
}).then(function () {
console.log("promise2");
});
console.log('script end');
复制代码
以上代码片断的执行结果为:ui
> "script start"
> "async1 start"
> "async2"
> "promise1"
> "script end"
> "async1 end"
> "promise2"
> "settimeout"
复制代码
----------------------------------------- 同步代码部分 --------------------------------------------spa
console.log("script start");
开始,遇到setTimeout直接丢到等待队列的最末端(实际上是另外一个优先级较低的等待队列的队首,姑且认为是promise等待队列的最末端)。console.log("async1 start");
为同步代码,直接输出,而后遇到了await async2
。console.log( 'async2');
,在执行事后立刻将await后面的代码所有放到promise等待队列中。console.log("promise1");
为同步代码,当即执行。而后发现这个promise后面紧跟真一个then(),不要犹豫直接将这个promise放入刚刚已经存放了await的等待队列中。console.log('script end');
被找到并执行。----------------------------------------- 异步代码部分 --------------------------------------------线程
如今的异步代码等待队列中,包含await函数后面的全部代码,和promise的then()code
console.log("async1 end");
。console.log("promise2");
。console.log("settimeout");
。√到此为止全部代码执行完毕。对象