Obularable.forkJoin of Angular Route Params Observable

时间:2017-03-10 19:37:33

标签: angular rxjs

在我的Angular组件ngOnInit()中,我想:

  1. 读取路由参数并以其作为参数执行依赖的HTTP调用。
  2. 执行单独的HTTP调用。
  3. 等待两个HTTP调用完成。
  4. 两个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 => { ... },
            () => { ... }
        );
    

2 个答案:

答案 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)