RxJS Observable.concat:如何知道下一个结果来自哪里?

时间:2016-06-03 07:14:24

标签: javascript angularjs typescript angular rxjs

我的应用程序(使用TypeScript编写的RxJS 5的Angular 2)要求我以预定义的顺序对Web服务进行2次调用。 Inspired by this page我决定尝试RxJS observables的concat运算符。扭曲的是,接收值的onNext回调需要将它们转发给不同的处理程序,具体取决于它们来自哪里

我的代码可以简化为:

suscription1 = Observable.return({name:'John', age:7});
subscription2 = Observable.return({name:'Mary', color:'blue'}); 
Observable.concat(subscription1, subscription2).subscribe(
    data=>{ /* need to know which subscripion 
             i'm dealing with to direct to the right handler*/}
);

确定每个可观察发射数据的最佳方式是什么?我想过几种方法,但它们看起来都很笨拙:

  1. 将计数器保留在范围内,可能作为类属性。每次收到结果时检查并递增。由于每个observable只发出一次,所以当第一个订阅输出时,计数器将具有其初始值,而当第二个订阅输出时,它将具有初始值+ 1。问题是,当我不知道每个观察者在完成之前会发出多少次时,这是行不通的。

  2. 检查每个结果并根据结果的形状确定其来源。例如,在我的示例中,只有第一个observable的结果具有age属性。显然,当结果具有相同的形状时,这变得不切实际。

  3. 完全摆脱concat运营商;订阅subscription2 onComplete处理程序中的subscription1。这可行,但不能很好地扩展;如果我有4或5个订阅连接,它就会变成嵌套的地狱。

  4. 解决方案3只有2个订阅...

    suscription1 = Observable.return({name:'John', age:7});
    subscription2 = Observable.return({name:'Mary', age:8}); 
    subscription1.subscribe(
        data=> this.handlerOne(data),
        error=>{},
        ()=> {
            subscription2.subscribe(
                data=>this.handlerTwo(data),
                error=>{},
                ()=>console.log('All subscriptions completed!')
            )
        }
    );
    

    所以我的问题:当使用Observable.concat按顺序订阅多个observable时,我的onNext处理程序如何确定数据的来源?或者,我是否应该为此目的使用另一个操作员?我无法使用forkJoin运算符,因为订阅的完成顺序非常重要。

1 个答案:

答案 0 :(得分:2)

你可以map让他们知道它的来源。

suscription1 = Observable.return({name:'John', age:7})
         .map(person => { person.source = 1; return person };
subscription2 = Observable.return({name:'Mary', age:8})
         .map(person => { person.source = 2; return person };

然后您可以轻松确定它的来源:

Observable.concat(subscription1, subscription2).subscribe(
    data=> { if (data.source == 1) /* do whatever */ }
);