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的理由,變成後續方法的參數。
兩個附加方法
// 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中文網其他相關文章!