1. 程式人生 > >es6 Promise.resolve()方法

es6 Promise.resolve()方法

Promise.resolve()方法

有時需要將現有物件轉為 Promise 物件,Promise.resolve方法就起到這個作用。

 
  1. const jsPromise = Promise.resolve($.ajax('/whatever.json'));

上面程式碼將 jQuery 生成的deferred物件,轉為一個新的 Promise 物件。

Promise.resolve等價於下面的寫法。

 
  1. Promise.resolve('foo')
  2. // 等價於
  3. new Promise(resolve => resolve('foo'))

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

(1)引數是一個 Promise 例項

如果引數是 Promise 例項,那麼Promise.resolve將不做任何修改、原封不動地返回這個例項。

(2)引數是一個thenable物件

thenable物件指的是具有then方法的物件,比如下面這個物件。

 
  1. let thenable = {
  2. then: function(resolve, reject) {
  3. resolve(42);
  4. }
  5. };

Promise.resolve

方法會將這個物件轉為 Promise 物件,然後就立即執行thenable物件的then方法。

 
  1. let thenable = {
  2. then: function(resolve, reject) {
  3. resolve(42);
  4. }
  5. };
  6.  
  7. let p1 = Promise.resolve(thenable);
  8. p1.then(function(value) {
  9. console.log(value); // 42
  10. });

上面程式碼中,thenable物件的then方法執行後,物件p1的狀態就變為resolved,從而立即執行最後那個then方法指定的回撥函式,輸出 42。

(3)引數不是具有then方法的物件,或根本就不是物件

如果引數是一個原始值,或者是一個不具有then方法的物件,則Promise.resolve方法返回一個新的 Promise 物件,狀態為resolved

 
  1. const p = Promise.resolve('Hello');
  2.  
  3. p.then(function (s){
  4. console.log(s)
  5. });
  6. // Hello

上面程式碼生成一個新的 Promise 物件的例項p。由於字串Hello不屬於非同步操作(判斷方法是字串物件不具有 then 方法),返回 Promise 例項的狀態從一生成就是resolved,所以回撥函式會立即執行。Promise.resolve方法的引數,會同時傳給回撥函式。

(4)不帶有任何引數

Promise.resolve方法允許呼叫時不帶引數,直接返回一個resolved狀態的 Promise 物件。

所以,如果希望得到一個 Promise 物件,比較方便的方法就是直接呼叫Promise.resolve方法。

 
  1. const p = Promise.resolve();
  2.  
  3. p.then(function () {
  4. // ...
  5. });

上面程式碼的變數p就是一個 Promise 物件。

需要注意的是,立即resolve的 Promise 物件,是在本輪“事件迴圈”(event loop)的結束時,而不是在下一輪“事件迴圈”的開始時。

 
  1. setTimeout(function () {
  2. console.log('three');
  3. }, 0);
  4.  
  5. Promise.resolve().then(function () {
  6. console.log('two');
  7. });
  8.  
  9. console.log('one');
  10.  
  11. // one
  12. // two
  13. // three

上面程式碼中,setTimeout(fn, 0)在下一輪“事件迴圈”開始時執行,Promise.resolve()在本輪“事件迴圈”結束時執行,console.log('one')則是立即執行,因此最先輸出。

轉載於:https://blog.csdn.net/ixygj197875/article/details/79183843