天天看點

Promise太難了!

時間是最好的解藥_

Promise的回調函數屬于異步任務,會在同步任務之後執行

new Promise(function (resolve, reject) {
  resolve(1);
}).then(console.log);

console.log(2);
// 2
// 1           

複制

但是,Promise的回調函數不是正常的異步任務,而是微任務(microtesk)。他們的差別在于,正常任務追加到下一個事件循環,微任務追加到本輪時間循環。這意味着,微任務的執行時間一定早于正常任務。

setTimeout(function() {
  console.log(1);
}, 0);

new Promise(function (resolve, reject) {
  resolve(2);
}).then(console.log);

console.log(3);
// 3
// 2
// 1           

複制

上面代碼的輸出結果是321。這說明then回調的執行時間早于setTimeout(fn, 0)。因為then是本輪事件循環,setTimeout(fn,0)在下一輪時間循環開始時執行。

參考文獻:http://javascript.ruanyifeng.com/advanced/promise.html#toc9