天天看點

一零零、Promise.resolve()詳解

Promise.resolve等價于下面的寫法

有時需要将現有對象轉為 Promise 對象,Promise.resolve方法就起到這個作用。

Promise.resolve('foo')
// 等價于
new Promise(resolve => resolve('foo'))
           

Promise.resolve方法的參數分成四種情況。

參數是一個 Promise 執行個體

如果參數是 Promise 執行個體,那麼Promise.resolve将不做任何修改、原封不動地傳回這個執行個體。

參數是一個thenable對象

thenable對象指的是具有then方法的對象,比如下面這個對象

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};
           

Promise.resolve方法會将這個對象轉為 Promise 對象,然後就立即執行thenable對象的then方法。

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

let p1 = Promise.resolve(thenable);
p1.then(function(value) {
  console.log(value);  // 42
});
           

thenable對象的then方法執行後,對象p1的狀态就變為resolved,進而立即執行最後那個then方法指定的回調函數,輸出 42

參數不是具有then方法的對象,或根本就不是對象

如果參數是一個原始值,或者是一個不具有then方法的對象,則Promise.resolve方法傳回一個新的 Promise 對象,狀态為resolved。

const p = Promise.resolve('Hello');

p.then(function (s){
  console.log(s)
});
// Hello
           

由于字元串Hello不屬于異步操作(判斷方法是字元串對象不具有 then 方法),傳回 Promise 執行個體的狀态從一生成就是resolved,是以回調函數會執行。Promise.resolve方法的參數,會同時傳給回調函數

不帶有任何參數

Promise.resolve方法允許調用時不帶參數,直接傳回一個resolved狀态的 Promise 對象。

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

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three
           

.then()函數裡不傳回值或者傳回的不是promise,那麼 then 傳回的 Promise 将會成為接受狀态(resolve)

Promise.resolve().then(() => console.log(2)).then(() => console.log(3));
console.log(1); // 1, 2, 3
           

需要注意的是,立即resolve的 Promise 對象,是在本輪“事件循環”(event loop)的結束時執行執行,不是馬上執行,也不是在下一輪“事件循環”的開始時執行

原因:傳遞到 then() 中的函數被置入了一個微任務隊列,而不是立即執行,這意味着它是在 JavaScript 事件隊列的所有運作時結束了,事件隊列被清空之後,才開始執行

resolve()本質作用

  • resolve()是用來表示promise的狀态為fullfilled,相當于隻是定義了一個有狀态的Promise,但是并沒有調用它;
  • promise調用then的前提是promise的狀态為fullfilled
  • 隻有promise調用then的時候,then裡面的函數才會被推入微任務中;

最後推薦一個 js常用的utils合集,幫我點個star吧~

  • github
  • 文檔

繼續閱讀