原文地址javascript
能夠在then
中返回一個新的promise
。這個retPromise
對象狀態爲Rejected的時候,會調用後面then
中的 onRejected
方法,這樣就實現了即便在then
中不使用 throw
也能進行reject
處理了。java
var onRejected = console.error.bind(console); var promise = Promise.resolve(); promise.then(function () { var retPromise = new Promise(function (resolve, reject) { reject(new Error("this promise is rejected")); }); return retPromise; }).catch(onRejected); // 使用Promise.reject還能夠簡化書寫 var onRejected = console.error.bind(console); var promise = Promise.resolve(); promise.then(function () { return Promise.reject(new Error("this promise is rejected")); // 注意 Promise.reject其實只是new Promise的簡潔寫法 做用是同樣的 }).catch(onRejected);
若是想直接更改promise
的狀態,那麼使用reject()
比使用throw
要安全。 若是直接使用throw
,就不太容易區分是主動拋出的error
,仍是代碼中的error
。jquery
(以jquery.deferred
相似實現爲例)git
deferred
和promise
不是競對,deferred
包含promise
。deferred
具有對promise
狀態進行操做的特權方法。github
所謂的能對Promise
狀態進行操做的特權方法,指的就是能對promise
對象的狀態進行resolve
、reject
等調用的方法,而一般的Promise
的話只能在經過構造函數傳遞的方法以內對promise
對象的狀態進行操做。promise
Promise
通常會在構造函數中編寫邏輯,何時執行fulfilled
回調,何時執行rejected
回調。可是deferred
只要定義一個對象以後,能夠在任意時間調用resolve
或者reject
方法。安全
deferred
最後返回return deferred.promise
能夠繼續鏈式調用。異步
換句話說,Promise
表明了一個對象,這個對象的狀態如今還不肯定,可是將來一個時間點它的狀態要麼變爲正常值(FulFilled)
,要麼變爲異常值(Rejected)
;而Deferred
對象表示了一個處理尚未結束的這種事實,在它的處理結束的時候,能夠經過Promise
來取得處理結果。函數
thenable
對象能夠經過Promise.resolve
轉化成Promise
對象。thenable
對象就是一個具備 .then
方法的一個對象。那麼普通的callback
也能夠經過添加then
方法變成thenable
對象,這個轉換過程是在resolve
中進行的,轉換中添加的then
方法與後面使用 .then
異步執行回調的then
不是同一回事。學習
Todos:
學習以前要對所學的東西有個整體上的計劃和步驟,有條理有重點的去開展。邊學習邊記錄的方法雖然也沒錯,可是當你看完以後發現知識點都是零散的,也仍是須要整理彙總。
由點到面再到點,這樣後續總結回顧的時候也可以很清楚的找到重點和難點。