用RxJS链接承诺

时间:2015-04-29 14:21:34

标签: javascript observable frp rxjs

我一般都是RxJS和FRP的新手。我想到将ExpressJS应用程序中现有的promise链转换为可观察的实践。我知道这可能不是最好的例子,但也许有人可以提供一些帮助。

我想做的事

  1. 我有两个承诺 - prom1和prom2
  2. 我希望prom1在prom2之前运行
  3. 如果prom1发送拒绝(错误),我想在启动前取消prom2。
  4. 我希望错误消息prom1返回可用于观察者的onError方法。
  5. var prom1 = new Promise(function(resolve, reject) {
        if (true) {
           reject('reason');
        }
        resolve(true);
    });
    
    var prom2 = new Promise(function(resolve, reject) {
        resolve(true);
    });
    
    // What do I do here? This is what I've tried so far...
    var source1 = Rx.Observable.fromPromise(prom1);
    var source2 = source1.flatMap(Rx.Observable.fromPromise(prom2));
    
    var subscription = source2.subscribe(
        function (result) { console.log('Next: ' + result); },
    
        // I want my error 'reason' to be made available here
        function (err) { console.log('Error: ' + err); },
    
        function () { console.log('Completed'); });
    

2 个答案:

答案 0 :(得分:5)

flatMap将Observable of Observables转换为Observable。它在Promises的许多例子中使用,因为通常你有一个可观察的,并且在map函数中你想为每个"项目创建一个承诺。可观察的emmits。因为每个fromPromise调用都会创建一个新的Observable,这使得它成为一个可观察的观察者"。 flatMap将其减少为" flat"观察到。

在您的示例中,您执行了不同的操作,将单个promise转换为observable,并希望将其与另一个observable链接(也可以从单个promise中创建)。 Concat做你想要的,它将两个可观察的链子连在一起。

错误案例将按您的预期运作。

答案 1 :(得分:-1)

Observable.forkJoin在接收其他Observable数组时效果很好。

Rx.Observable.forkJoin([this.http.get('http://jsonplaceholder.typicode.com/posts'), this.http.get('http://jsonplaceholder.typicode.com/albums')]).subscribe((data) => {
      console.log(data);
    });