promise學習(2)

原文地址javascript

1. 在then中使用reject

若是一個promise最初只定義了resolve,可是還想要使用reject怎麼辦?

能夠在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,仍是代碼中的errorjquery

2. Deferred和Promise之間的關係

(以jquery.deferred相似實現爲例)git

deferredpromise不是競對,deferred包含promisedeferred具有對promise狀態進行操做的特權方法。github

所謂的能對Promise狀態進行操做的特權方法,指的就是能對promise對象的狀態進行resolvereject等調用的方法,而一般的Promise的話只能在經過構造函數傳遞的方法以內對promise對象的狀態進行操做。promise

Promise 通常會在構造函數中編寫邏輯,何時執行fulfilled回調,何時執行rejected回調。可是deferred只要定義一個對象以後,能夠在任意時間調用resolve或者reject方法。安全

deferred最後返回return deferred.promise 能夠繼續鏈式調用。異步

換句話說,Promise表明了一個對象,這個對象的狀態如今還不肯定,可是將來一個時間點它的狀態要麼變爲正常值(FulFilled),要麼變爲異常值(Rejected);而Deferred對象表示了一個處理尚未結束的這種事實,在它的處理結束的時候,能夠經過Promise來取得處理結果。函數

3. thenable對象

thenable對象能夠經過Promise.resolve轉化成Promise對象。thenable對象就是一個具備 .then方法的一個對象。那麼普通的callback也能夠經過添加then方法變成thenable對象,這個轉換過程是在resolve中進行的,轉換中添加的then方法與後面使用 .then異步執行回調的then不是同一回事。學習

Todos:

  • promise 任務隊列原理
  • promise擴展庫是如何獲取promise的狀態以及取消promise動做的
  • promise反模式

4. 學習方法

學習以前要對所學的東西有個整體上的計劃和步驟,有條理有重點的去開展。邊學習邊記錄的方法雖然也沒錯,可是當你看完以後發現知識點都是零散的,也仍是須要整理彙總。

由點到面再到點,這樣後續總結回顧的時候也可以很清楚的找到重點和難點。

相關文章
相關標籤/搜索