Promise.resolve()詳解

Promise.resolve等價於下面的寫法

有時須要將現有對象轉爲 Promise 對象,Promise.resolve方法就起到這個做用。promise

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方法。oop

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方法指定的回調函數,輸出 42code

參數不是具備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方法的參數,會同時傳給回調函數three

不帶有任何參數

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 事件隊列的全部運行時結束了,事件隊列被清空以後,纔開始執行ip

resolve()本質做用

  • resolve()是用來表示promise的狀態爲fullfilled,至關於只是定義了一個有狀態的Promise,可是並無調用它;
  • promise調用then的前提是promise的狀態爲fullfilled;
  • 只有promise調用then的時候,then裏面的函數纔會被推入微任務中;
相關文章
相關標籤/搜索