1. 程式人生 > >Angular2 之 Promise vs Observable

Angular2 之 Promise vs Observable

如果看成狀態機

  • Promise 具有 3 個狀態:pending、resolved、rejected(如果 Cancelable Promise 正式通過,那麼還會增加一個狀態)。
  • Observable 有 N + 3 個狀態:idle、pending、resolved_0、resolved_1 … resolved_N、completed 和 error。

    總結:相比於 Promise 這個有限狀態機而言,Observable 既可能是有限狀態機,也可能是無限狀態機(N 為無窮)。

呼叫情況

  • Observable 還具有可訂閱性,對於 Cold Observable 而言,只有訂閱後才開始起作用
  • Promise 一經產生便開始起作用

    總結:在視訊中有詳細的介紹。

結束

  • 由於 Promise 僅有一個數據,故資料被獲取即為 Promise 完成,僅需要一個狀態。
  • Observable,由於可以有任意多個數據,因此需要一個額外的狀態來表示完成,一經完成後便不能再產生資料。

運算子

  • Promise ,由於有且只有一個數據,所以無需複雜的操作,僅需要一個簡單的變換(返回值)或者組合(返回另一個 Promise)功能即可,甚至還可以把組合變換與使用統一為一個操作,也就是我們的 .then。
  • Observable,由於可以有任意多個數據,為了使用上的方便,提供了很多運算子,用來簡化使用者程式碼(可以參考 Array)。

    • 對於變換,(最簡單的方式)需要使用 .map 方法,用來把 Observable 中的某個元素轉換成另一種形式。
    • 對於組合,(最簡單的方式)需要使用 .mergeMap 方法,用來把兩個 Observable 整合為一個 Observable;
    • 對於使用,我們需要使用 .subscribe 方法,用來通知 Observer 我們需要它開始工作。
  • 當然還可能有另一類運算子,比如 .toPromise 等,這些並不返回 Observable 的方法其實本身並不是一個運算子,僅僅是對 Observable 的原型擴充套件。

參考文件:

寫在後面

GitHub上集大家之力搞了一個前端面試題的專案,裡面都是大家面試時所遇到的題以及一些學習資料,有興趣的話可以關注一下。如果你也有興趣加入我們的話,請在專案中留言。專案同時也可以在gitbook上檢視。