setTimeout(function() {
console.log(1)
}, 0);
new Promise(function(resolve, reject) {
console.log(2)
for (var i = 0; i < 10000; i++) {
if(i === 10) {console.log(10)}
i == 9999 && resolve();
}
console.log(3)
}).then(function() {
console.log(4)
})
console.log(5);
輸出答案:2 10 3 5 4 1
- 要先弄清楚settimeout(fun,0)何時執行,promise何時執行,then何時執行
- settimeout這種異步操作的回調,只有主線程中沒有執行任何同步代碼的前提下,才會執行異步回調,而settimeout(fun,0)表示立刻執行,也就是用來改變任務的執行順序,要求瀏覽器盡可能快的進行回調
- promise何時執行,由上圖可知promise新建后立即執行,所以promise構造函數里代碼同步執行的,
- then方法指向的回調將在當前腳本所有同步任務執行完成后執行,
- 那么then為什么比settimeout執行的早呢,因為settimeout(fun,0)不是真的立即執行,
- 經過測試得出結論:執行順序為:同步執行的代碼-》promise.then->settimeout