javascript - RxJS 使用两个参数订阅

标签 javascript angular typescript rxjs

我有两个可观察量,我想将它们组合起来,并在订阅中使用两个参数或仅使用一个参数。我尝试了 .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 之前还是之后发出值,都会有不同的行为,这可能会影响用例。

最佳答案

有几个运算符可以完成此操作:

合并最新

该运算符将组合两个可观察量发出的最新值,如弹珠图所示:

CombineLatest marble diagram

obs1: Observable<int>;
obs2: Observable<Boolean>;

save(): Observable<any> {
   return combineLatest(obs1, obs2);
}

save().subscribe((val1, val2) => { 
   // logic
});

zip

Zip 运算符将等待两个可观察量发出值,然后再发出一个值。

Zip marble diagram

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 发出由可观察量发出的最后一个值的组合,请注意,此运算符会跳过其他可观察量中没有对应值的任何值。

WithLatestFrom marble diagram

save: obs1.pipe(withLatestFrom(secondSource))

save().subscribe(([val1, val2]) => {
    // Logic
});

关于javascript - RxJS 使用两个参数订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470406/

相关文章:

javascript - Angular ng2-file-upload 输入文件过滤器不适用于 Internet Explorer 中的 PNG

javascript - 如何像 Excel 一样对 TypeScript 中的列进行比较(小于)

javascript - typescript 数组

javascript - "A+"中的 "Promise/A+"代表什么?

javascript - 在 ngFor 循环中仅切换一个特定面板

javascript - 如何在 Angular Reactive Forms 中做 required-if?

angular - 如何访问可重用组件内的 ngModel 元素

javascript - 无法将传统的 for 循环转换为 for-each 循环

javascript - Selenium 中未加载外部 javascript

javascript - Angular.JS 接受表单输入并将该字符串转换为 HTML