constructor(
private route: ActivatedRoute,
private http: Http
){
// Observe parameter changes
let paramObs = route.paramMap;
// Fetch data once
let dataObs = http.get('...');
// Subscribe to both observables,
// use both resolved values at the same level
}
是否有类似于forkJoin
的内容会在发出参数更改时触发? forkJoin
仅在所有可观测量完成后才有效。
我只需要避免回调地狱,任何符合要求的替代方案都是受欢迎的。
答案 0 :(得分:11)
有几种选择:
使用take(1)
与forkJoin()
完成每个来源Observable:
forkJoin(o1$.take(1), o2$.take(1))
仅当所有源Observable发出相同数量的项目时,才使用zip()
和take(1)
发出:
zip(o1$, o2$).take(1)
当任何源Observable发出时,使用combineLatest()
发出:
combineLatest(o1$, o2$)
2019年1月:更新了RxJS 6
答案 1 :(得分:2)
除了其他答案之外,请考虑使用Observable.concat()
来按顺序处理每个可观察对象。这是一个例子:
const getPostOne$ = Rx.Observable.timer(3000).mapTo({id: 1});
const getPostTwo$ = Rx.Observable.timer(1000).mapTo({id: 2});
Rx.Observable.concat(getPostOne$, getPostTwo$).subscribe(res => console.log(res));
概述6 operators you should know的好文章。
答案 2 :(得分:0)
一个小技巧,可避免在任何一个可观察对象失败时破坏可观察对象订阅。
import { throwError, of, forkJoin } from "rxjs";
import { catchError, take } from "rxjs/operators";
//emits an error with specified value on subscription
const observables$ = [];
const observableThatWillComplete$ = of(1, 2, 3, 4, 5).pipe(take(1));
const observableThatWillFail$ = throwError(
"This is an error hence breaking the stream"
).pipe(catchError((error) => of(`Error Catched: ${error}`)));
observables$.push(observableThatWillComplete$, observableThatWillFail$);
forkJoin(observables$).subscribe(responses => {
console.log("Subscribed");
console.log(responses);
});