Javascript RxJS Observable.concat:如何知道下一个结果来自哪里?
我的应用程序(Angular 2和用TypeScript编写的RxJS 5)要求我按预定义顺序对web服务进行两次调用。我决定尝试RxJS observables的Javascript RxJS Observable.concat:如何知道下一个结果来自哪里?,javascript,angularjs,typescript,angular,rxjs,Javascript,Angularjs,Typescript,Angular,Rxjs,我的应用程序(Angular 2和用TypeScript编写的RxJS 5)要求我按预定义顺序对web服务进行两次调用。我决定尝试RxJS observables的concat操作符。问题在于,接收值的onNext回调需要根据值的来源将它们转发到不同的处理程序 我的代码可以简化为: suscription1 = Observable.return({name:'John', age:7}); subscription2 = Observable.return({name:'Mary', colo
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*/}
);
确定每次可观测发射数据来源的最优雅的方法是什么?我想到了几种方法,但它们都显得笨拙:
age
属性。显然,当结果具有相同形状时,这变得不切实际concat
操作符;在subscription1
的onComplete
处理程序中订阅subscription2
。这会起作用,但不能很好地扩展;如果我有4或5个订阅要连接,它将变成嵌套地狱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
运算符,因为订阅完成的顺序很重要。您可以映射
订阅以了解它来自何处
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 */ }
);
有趣。我认为
map
只能在subscribe
之后调用,但显然不能。我对更改person
结果本身感到不舒服,因此我修改了您的建议,添加了一个兄弟属性:.map(e=>{return{source:1,result:e}})
在第二个映射中,person.source
的值不应与第一个映射中的值相同。你现在把它们都设置为1Woops,是的,这太愚蠢了,谢谢你的更正!