在我的Angular组件ngOnInit()
中,我想:
两个HTTP调用都在执行,但是当我的第一个observable连接到route.params
时,forkJoin(...).subscribe(...)
方法永远不会运行。如果我将this.route.params
替换为Observable.of({id: 1234})
forkJoin().subscribe()
,则可以正确调用。
// VERSION 1 forkJoin().subscribe() never gets called
var dependentObservable = this.route.params
.switchMap(params => {
this.myId = +params['id'];
return this.myService.getMyInfo(this.myId);
});
// VERSION 2 forkJoin().subscribe gets called
var dependentObservable = Observable.of({id: 123})
.switchMap(params => {
this.myId = +params['id'];
return this.myService.getMyInfo(this.myId);
});
var independentObservable = this.myService.getOtherInfo();
Observable.forkJoin([dependentObservable, independentObservable])
.subscribe(
results = { ... },
error => { ... },
() => { ... }
);
答案 0 :(得分:17)
我的猜测route.params
永远不会完成。这就是forkJoin
不起作用的原因。您可以使用combineLatest
代替forkJoin
答案 1 :(得分:6)
根据这个doc forkJoin,当所有可观察的完成时,从每个observable中发出最后一个值。
Observable.of({id: 123})
将在给予{id:123}
后立即补充但是
this.route.params
永远不会完成。由于用户在编辑浏览器地址栏时可以更改路径参数。这种变化永远不会停止。
我认为你可以使用take(1)完成observable:
this.route.params.take(1)
或者,如果您想要更改路线参数,请使用combineLatest
Observable.combineLatest(dependentObservable, independentObservable)