含以上:抽象異步操做的工具。
javascript中:Promise就是一個構造函數(函數也是對象)javascript
1.多個嵌套的異步操做,若是直接用callback方式,會致使callback hell
2.Promise的出現使得異步操做更加規範,API更加統一。
3.多個異步操做之間較複雜的關係能夠簡單經過Promise處理。java
fulfilled:知足,成功
rejected:拒絕,失敗
pending:初始狀態
注:settled是指fulfilled,rejected狀態之一。ajax
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還提供了全局的靜態方法用於快速生成Promise對象。
Promise.resolve生成fulfilled狀態的Promise
Promise.reject生成rejected狀態的Promise函數
Promise.resolve( 'resolved value' ); Promise.reject( 'rejected value' );
then和catch用於處理Promise fullfilled成功或者rejected失敗時候的狀況。
更加推薦的作法:
myPromise.then(onfulfilled).catch(onrejected);
這樣的好處:
1.then,catch區分開,分別處理成功,失敗,代碼更容易理解。
2.then().then().then().catch(); then,catch方式能夠捕獲到前面多個then中的異常。工具
由於Promise.prototype.then方法和Promise.prototype.catch方法都返回Promise對象。因此能夠鏈式調用:prototype
myPromise.then(xxx).then(xxx);
onfulfilled,onrejected的返回值 | then,catch的返回值 |
---|---|
值(經常使用) fulfilled Promise |
fulfilled Promise |
throw Error異常 rejected Promise |
rejected Promise |
pending Promise | pending 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仍是程序執行出錯。