首頁  >  文章  >  web前端  >  es6之Promise的詳細介紹

es6之Promise的詳細介紹

零下一度
零下一度原創
2017-06-26 15:23:451822瀏覽

Promise

  1. Promise是一個對象,從它可以取得非同步操作的訊息;

  2. 特點:物件的狀態不受外界影響(Pending進行中、Resolved完成、Rejected失敗),只有非同步操作的結果可以決定當前狀態;一旦狀態改變就不會再變(只能從Pending到Resolved和Pending到Rejected);

  3. #缺點:一旦創建就會立即執行無法中途取消;如果沒有回呼函數,內部拋出的錯誤無法反映到外部;當處於Pending時,無法得知目前進展到哪一階段;

  4. 一般不要在then方法裡面定義Reject狀態的回呼函數(即then的第二個參數),而是使用catch方法;因為這種可以捕捉前面then中的錯誤,也更接近同步寫法(try/catch)

  5. catch方法返回的還是一個Promise 對象,因此後面還可以接著呼叫then方法;catch方法之中,還能再拋出錯誤

  6. Promise.all方法用於將多個Promise實例,包裝成一個新的Promise實例;Promise.all方法的參數可以不是數組,但必須具有Iterator接口,且傳回的每個成員都是Promise實例;只有p1 p2 p3狀態都變成fulfilled,p狀態才會變成fulfilled;只要有一個rejected,p就變成rejected;

  7. Promise.race也是將多個Promise實例包裝成新的Promise;只要有一個物件狀態變了,p狀態就會跟著變,傳回先改變的物件的值傳給p的回呼函數;

  8. Promise.resolve將物件轉換為Promise對象,狀態為resolved

    // 将thenable对象转为Promise对象var thenable = {
        then(resolve, reject) {
            resolve(200)
        }
    }var p = Promise.resolve(thenable)
    
    p.then((data) => {
      console.log(data)
    })  // 200
  9. Promise.reject傳回一個Promise對象,實例狀態為rejected;這個方法方法的參數,會原封不動地作為reject的理由,變成後續方法的參數。

  10. 兩個附加方法

    // donePromise.prototype.done = function(onFulfilled, onRejected) {this.then(onFulfilled, onRejected)
            .catch(function(reason) {
                setTimeout(() => {throw reason}, 0)   
            });
    };// finallyPromise.prototype.finally = function (callback) {
        let P = this.constructor;return this.then(
            value  => P.resolve(callback()).then(() => value),
            reason => P.resolve(callback()).then(() => { throw reason })
        );
    };

    done用於捕獲任何時候可能出現的錯誤,並且全域拋出;
    finally用來不管Promise物件狀態如何,都會執行的操作,接受一個普通的回呼函數作為參數(必執行);

#

以上是es6之Promise的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn