Promise done用於捕獲任何時候可能出現的錯誤,並全局拋出;finally用於不管Promise對象狀態如何,都會執行的操作,接受一個普通的回調函數作為參數(必執行); ...
Promise
- Promise是一個對象,從它可以獲取非同步操作的消息;
- 特點:對象的狀態不受外界影響(Pending進行中、Resolved完成、Rejected失敗),只有非同步操作的結果可以決定當前狀態;一旦狀態改變就不會再變(只能從Pending到Resolved和Pending到Rejected);
- 缺點:一旦創建就會立即執行無法中途取消;如果沒有回調函數,內部拋出的錯誤無法反映到外部;當處於Pending時,無法得知目前進展到哪一階段;
- 一般不要在then方法裡面定義Reject狀態的回調函數(即then的第二個參數),而是使用catch方法;因為這種可以捕獲前面then中的錯誤,也更接近同步寫法(try/catch)
- catch方法返回的還是一個 Promise 對象,因此後面還可以接著調用then方法;catch方法之中,還能再拋出錯誤
- Promise.all方法用於將多個Promise實例,包裝成一個新的Promise實例;Promise.all方法的參數可以不是數組,但必須具有Iterator介面,且返回的每個成員都是Promise實例;只有p1 p2 p3狀態都變成fulfilled,p狀態才會變成fulfilled;只要有一個rejected,p就變成rejected;
- Promise.race也是將多個Promise實例包裝成新的Promise;只要有一個對象狀態變了,p狀態就會跟著變,返回先改變的對象的值傳給p的回調函數;
- 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
- Promise.reject返回一個Promise對象,該實例狀態為rejected;這個方法方法的參數,會原封不動地作為reject的理由,變成後續方法的參數。
- 兩個附加方法
// done Promise.prototype.done = function(onFulfilled, onRejected) { this.then(onFulfilled, onRejected) .catch(function(reason) { setTimeout(() => {throw reason}, 0) }); }; // finally Promise.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對象狀態如何,都會執行的操作,接受一個普通的回調函數作為參數(必執行);