我有两个可观察量,我想将它们组合起来,并在订阅中使用两个参数或仅使用一个参数。我尝试了 .ForkJoin、.merge、.concat 但无法实现我正在寻找的行为。
示例:
obs1: Observable<int>;
obs2: Observable<Boolean>;
save(): Observable<any> {
return obs1.concat(obs2);
}
那么使用这个函数时:
service.save().subscribe((first, second) => {
console.log(first); // int e.g. 1000
console.log(second); // Boolean, e.g. true
});
或
service.save().subscribe((first) => {
console.log(first); // int e.g. 1000
});
是否有可能实现这种行为?
希望有人能帮忙!
编辑:
在我的具体用例中obs1<int>
和obs2<bool>
是两个不同的帖子请求:obs1<int>
是实际的保存函数,obs2<bool>
检查其他服务是否正在运行。
obs1<int>
的值请求完成后需要重新加载页面并且值为 obs2<bool>
如果服务正在运行,则需要显示消息 - 独立于 obs1<int>
.
所以如果 obs2<bool>
在 obs1<int>
之前发出,这不是问题,消息会在重新加载之前显示。但如果obs1<int>
在 obs2<bool>
之前发出,页面会重新加载,并且该消息可能不再显示。
我之所以这么说,是因为根据给定的答案,无论在其他可观察值的 onComplete 之前还是之后发出值,都会有不同的行为,这可能会影响用例。
最佳答案
有几个运算符可以完成此操作:
合并最新
该运算符将组合两个可观察量发出的最新值,如弹珠图所示:
obs1: Observable<int>;
obs2: Observable<Boolean>;
save(): Observable<any> {
return combineLatest(obs1, obs2);
}
save().subscribe((val1, val2) => {
// logic
});
zip
Zip
运算符将等待两个可观察量发出值,然后再发出一个值。
obs1: Observable<int>;
obs2: Observable<Boolean>;
save(): Observable<any> {
return zip(obs1, obs2);
}
save().subscribe((vals) => {
// Note Vals = [val1, val2]
// Logic
});
或者如果您想对数组使用解构
save().subscribe(([val1, val2]) => {
// Logic
});
WithLatestFrom
WithLatestFrom
发出由可观察量发出的最后一个值的组合,请注意,此运算符会跳过其他可观察量中没有对应值的任何值。
save: obs1.pipe(withLatestFrom(secondSource))
save().subscribe(([val1, val2]) => {
// Logic
});
关于javascript - RxJS 使用两个参数订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470406/