2015-12-30 60 views
37

我曾經有許多承諾,現在我正在轉向RxJS。 RxJS的文檔沒有提供一個非常明確的例子,說明如何從承諾鏈轉向觀察者序列。RxJS序列與promise.then等價嗎?

例如,我平時寫多個步驟的承諾鏈,像

// a function that returns a promise 
getPromise() 
.then(function(result) { 
    // do something 
}) 
.then(function(result) { 
    // do something 
}) 
.then(function(result) { 
    // do something 
}) 
.catch(function(err) { 
    // handle error 
}); 

我應該如何在RxJS風格改寫這個諾言鏈?

回答

42

對於數據流(相當於then):

Rx.Observable.fromPromise(...) 
    .flatMap(function(result) { 
    // do something 
    }) 
    .flatMap(function(result) { 
    // do something 
    }) 
    .subscribe(function onNext(result) { 
    // end of chain 
    }, function onError(error) { 
    // process the error 
    }); 

甲諾可被轉化爲可觀察到的與Rx.Observable.fromPromise

有些許運營商有直接的翻譯。例如RSVP.alljQuery.when可以替換爲Rx.Observable.forkJoin

請記住,你有一堆運營商的,允許異步轉換數據,並執行,你不能或將很難做承諾的任務。 Rxjs以異步數據序列(序列即多於1個異步值)揭示其所有功能。

對於錯誤的管理,主體是更復雜一點。

  • catchfinally運營商也
  • retryWhen也有助於重複序列中的錯誤
  • 的情況下,你也可以應對用戶本身帶有onError功能錯誤。

對於精確的語義,請深入瞭解您可以在網上找到的文檔和示例,或者在此處詢問具體問題。

這肯定會是一個很好的出發點,在錯誤管理與Rxjs不斷深入:https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/error_handling.html

+0

我總是看到可觀察序列與認購結束()。由於這只是可觀察對象的功能,是否有理由這樣做?它是啓動序列的功能嗎? –

+0

就是這樣。如果沒有觀察者通過訂閱,您的可觀察數據將不會發出任何數據,因此您不會看到任何數據流。 – user3743222

+5

我建議你看看這個:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754。 IT可能更適合官方文檔。 – user3743222