2015-12-30 57 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