RxJS Observables 嵌套订阅?
RxJS Observables nested subscriptions?
如何简化类似于以下代码示例的内容?
我找不到合适的运算符.. 谁能举个简短的例子?
this.returnsObservable1(...)
.subscribe(
success => {
this.returnsObservable2(...)
.subscribe(
success => {
this.returnsObservable3(...)
.subscribe(
success => {
...
},
如评论中所述,您正在寻找 flatMap
运算符。
您可以在以前的答案中找到更多详细信息:
- How to do the chain sequence in rxjs
您的示例将读作:
this.returnsObservable1(...)
.flatMap(success => this.returnsObservable2(...))
.flatMap(success => this.returnsObservable3(...))
.subscribe(success => {(...)});
switchMap 运算符也很有用。
可以在此处找到一些描述 switchMap 与嵌套订阅相比有用的示例:
- 嵌套订阅的情况
本codepen给出了一个demo:
https://codepen.io/anon/pen/zdXBvP?editors=1111
Rx.Observable
.interval(5000)
.subscribe((val) => {
console.log("outer:", val);
Rx.Observable
.interval(1000)
.subscribe((ival) => {
console.log("inner:", val, ival);
});
});
- switchMap 的情况
本codepen给出了一个demo:
https://codepen.io/anon/pen/xLeOZW?editors=1111
Rx.Observable
.interval(5000)
.switchMap((val) => {
console.log("outer:", val);
return Rx.Observable.interval(1000).map((ival) => [val, ival]);
})
.subscribe((val) => {
console.log("inner:", val[0], val[1]);
});
之前回答了 RxJS 5,我在使用 6 时来到了这个页面。
如果你也在 6(我想你现在应该是)你可以使用 flatmap
作为 operator 在 pipe
.[=14 中=]
修改了@user3743222的示例代码:
this.returnsObservable1(...)
.pipe(
flatMap(success => this.returnsObservable2(...)),
flatMap(success => this.returnsObservable3(...))
)
.subscribe(success => {(...)});
你基本上需要排序。
使用 RxJS concat
,你可以这样做:
import { concat } from 'rxjs';
...
concat(
this.returnsObservable1(...),
this.returnsObservable2(...),
this.returnsObservable3(...),
...
)
.subscribe(success => {(...)});
如果您的后续 Observable 需要知道之前 Observable 的值,您可以使用 RxJS concatMap
运算符。
import { concatMap } from 'rxjs/operators';
...
this.returnsObservable1(...)
.pipe(
concatMap(result1 => this.returnsObservable2(...)),
concatMap(result2 => this.returnsObservable3(...)),
...
)
.subscribe(success => {(...)});
连接:https://www.learnrxjs.io/learn-rxjs/operators/combination/concat
concatMap: https://www.learnrxjs.io/learn-rxjs/operators/transformation/concatmap
如何简化类似于以下代码示例的内容? 我找不到合适的运算符.. 谁能举个简短的例子?
this.returnsObservable1(...)
.subscribe(
success => {
this.returnsObservable2(...)
.subscribe(
success => {
this.returnsObservable3(...)
.subscribe(
success => {
...
},
如评论中所述,您正在寻找 flatMap
运算符。
您可以在以前的答案中找到更多详细信息:
- How to do the chain sequence in rxjs
您的示例将读作:
this.returnsObservable1(...)
.flatMap(success => this.returnsObservable2(...))
.flatMap(success => this.returnsObservable3(...))
.subscribe(success => {(...)});
switchMap 运算符也很有用。 可以在此处找到一些描述 switchMap 与嵌套订阅相比有用的示例:
- 嵌套订阅的情况
本codepen给出了一个demo: https://codepen.io/anon/pen/zdXBvP?editors=1111
Rx.Observable
.interval(5000)
.subscribe((val) => {
console.log("outer:", val);
Rx.Observable
.interval(1000)
.subscribe((ival) => {
console.log("inner:", val, ival);
});
});
- switchMap 的情况
本codepen给出了一个demo: https://codepen.io/anon/pen/xLeOZW?editors=1111
Rx.Observable
.interval(5000)
.switchMap((val) => {
console.log("outer:", val);
return Rx.Observable.interval(1000).map((ival) => [val, ival]);
})
.subscribe((val) => {
console.log("inner:", val[0], val[1]);
});
之前回答了 RxJS 5,我在使用 6 时来到了这个页面。
如果你也在 6(我想你现在应该是)你可以使用 flatmap
作为 operator 在 pipe
.[=14 中=]
修改了@user3743222的示例代码:
this.returnsObservable1(...)
.pipe(
flatMap(success => this.returnsObservable2(...)),
flatMap(success => this.returnsObservable3(...))
)
.subscribe(success => {(...)});
你基本上需要排序。
使用 RxJS concat
,你可以这样做:
import { concat } from 'rxjs';
...
concat(
this.returnsObservable1(...),
this.returnsObservable2(...),
this.returnsObservable3(...),
...
)
.subscribe(success => {(...)});
如果您的后续 Observable 需要知道之前 Observable 的值,您可以使用 RxJS concatMap
运算符。
import { concatMap } from 'rxjs/operators';
...
this.returnsObservable1(...)
.pipe(
concatMap(result1 => this.returnsObservable2(...)),
concatMap(result2 => this.returnsObservable3(...)),
...
)
.subscribe(success => {(...)});
连接:https://www.learnrxjs.io/learn-rxjs/operators/combination/concat
concatMap: https://www.learnrxjs.io/learn-rxjs/operators/transformation/concatmap