1. 程式人生 > >setTimeout async promise執行順序總結

setTimeout async promise執行順序總結

async function async1() {
console.log(“async1 start”);
await async2();
console.log(“async1 end”);
}

async function async2() {
console.log(‘async2’);
}

console.log(“script start”);

setTimeout(function () {
console.log(“settimeout”);
}, 0);

async1();

new Promise(function (resolve) {
console.log(“promise1”);
resolve();
}).then(function () {
console.log(“promise2”);
});

console.log(‘script end’);

第一步:執行console.log(“script start”),所以列印script start

第二步,執行setTimeout,會將程式碼新增到事件佇列,等同步程式碼執行完畢,再來執行。

第三步:執行async1函式,
先列印async1 start
執行await async2(),這時會執行async2函式,列印async2
await執行完,會讓出當前執行緒,退出async1函式,將await後面的程式碼新增到事件佇列中,等同步程式碼執行完,就執行事件佇列中程式碼

第四步,建立promise物件裡面的程式碼屬於同步程式碼,promise的非同步性體現在then與catch處,執行promse中的同步程式碼,then或者catch中的程式碼會加入到事件佇列中,等同步程式碼執行完再執行。列印promise1

第五步,繼續執行同步程式碼,列印script end,同步程式碼執行完畢。

第六步,同步程式碼執行完畢後,由於setTimeout的任務佇列優先順序低於promise佇列,所以優先執行promise佇列,後執行setTimeout佇列,先列印await後面的程式碼,列印async1 end

第七步,再執行promise中then中的程式碼,列印promise2

第八步,最後執行setTimeout中的程式碼,列印settimeout