Promise的理解

什麼是Promise?

含以上:抽象異步操做的工具。
javascript中:Promise就是一個構造函數(函數也是對象)javascript

爲何須要Promise?

1.多個嵌套的異步操做,若是直接用callback方式,會致使callback hell
2.Promise的出現使得異步操做更加規範,API更加統一。
3.多個異步操做之間較複雜的關係能夠簡單經過Promise處理。java

Promise的三種狀態

fulfilled:知足,成功
rejected:拒絕,失敗
pending:初始狀態
注:settled是指fulfilled,rejected狀態之一。ajax

Promise的方法:

Promise()構造函數

Promise(
    //executor
    function( resolve,reject){
    }
);

構造函數用於生成Promise對象,executor函數在Promise構造函數執行時同步執行。
resolve,reject函數被調用時分別將Promise狀態設置爲fulfilled,rejected異步

new Promise( (resolve, reject)=>{
    resolve( 'resolved value' );
});

new Promise( (resolve, reject)=>{
    reject( 'rejected value' );
});

Promise.resolve, Promise.reject

Promise還提供了全局的靜態方法用於快速生成Promise對象。
Promise.resolve生成fulfilled狀態的Promise
Promise.reject生成rejected狀態的Promise函數

Promise.resolve( 'resolved value' );
    Promise.reject( 'rejected value' );

Promise實例方法:then( onfulfilled, onrejected ), catch( onrejected )

then和catch用於處理Promise fullfilled成功或者rejected失敗時候的狀況。
更加推薦的作法:
myPromise.then(onfulfilled).catch(onrejected);
這樣的好處:
1.then,catch區分開,分別處理成功,失敗,代碼更容易理解。
2.then().then().then().catch(); then,catch方式能夠捕獲到前面多個then中的異常。工具

Promise能夠鏈式調用的緣由?

由於Promise.prototype.then方法和Promise.prototype.catch方法都返回Promise對象。因此能夠鏈式調用:prototype

myPromise.then(xxx).then(xxx);

Promise.prototype.then(onfulfilled, onrejected)當中,then返回的Promise和onfulfilled,onrejected的返回值有什麼聯繫?

onfulfilled,onrejected的返回值 then,catch的返回值
值(經常使用)
fulfilled Promise
fulfilled Promise
throw Error異常
rejected Promise
rejected Promise
pending Promise pending Promise

多個Promise關聯操做

假設有A/B/C三個Promise
1.A執行完才能執行B,B執行完才能執行C
典型的順序執行關係,直接使用鏈式操做:設計

A.then(()=>{return B})
 .then(()=>{return C});

2.A/B執行成功了才能執行Ccode

Promise.all([A,B]).then(
()=>{
    return C;
}
);

3.ABC中任意一個settled便可:
Promise([A,B,C]).then(xxx).catch(xxx);
注意:第一個Promise settled以後,不會取消剩餘的Promise對象的執行。對象

額外知識:

1.Promise.resolve方法除了快速建立Promise之外,還可以將thenable(有.then方法的對象)對象轉換爲Promise。 典型的$.ajax()就會返回thenable對象。

2.then(onfulfilled, onrejected)中的onfulfilled,onrejected方法是異步調用的即時在調用Promise.prototype.then註冊Promise時,Promise已經setteled,這2個函數也不會立刻同步執行。Promise會以異步方式調用該回調函數,這個Promise設計上的規定方針。

3.若是若是沒有註冊onrejected函數,那麼異常會拋出,只是捕獲不了。

4.儘可能不要使用非鏈式操做Promise對象, 非鏈式操做狀況下異常不會被捕獲,也不能獲得then的返回值(即時then有返回值的狀況)

5.使用reject而不是throw來觸發Promise失敗,由於throw的話很難區分是主動拋出的rejected仍是程序執行出錯。

相關文章
相關標籤/搜索