我的应用程序(使用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*/}
);
确定每个可观察发射数据的最佳方式是什么?我想过几种方法,但它们看起来都很笨拙:
将计数器保留在范围内,可能作为类属性。每次收到结果时检查并递增。由于每个observable只发出一次,所以当第一个订阅输出时,计数器将具有其初始值,而当第二个订阅输出时,它将具有初始值+ 1。问题是,当我不知道每个观察者在完成之前会发出多少次时,这是行不通的。
检查每个结果并根据结果的形状确定其来源。例如,在我的示例中,只有第一个observable的结果具有age
属性。显然,当结果具有相同的形状时,这变得不切实际。
完全摆脱concat
运营商;订阅subscription2
onComplete
处理程序中的subscription1
。这可行,但不能很好地扩展;如果我有4或5个订阅连接,它就会变成嵌套的地狱。
解决方案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
运算符,因为订阅的完成顺序非常重要。
答案 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 */ }
);