Obularable.forkJoin的Angular Route Params Observable

Jef*_*sen 8 rxjs angular

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

  1. 读取路由参数并使用它作为参数执行从属HTTP调用.
  2. 执行单独的HTTP调用.
  3. 等待两个HTTP调用完成.

两个HTTP调用都在执行,但是当我的第一个observable连接到时route.params,该forkJoin(...).subscribe(...)方法永远不会运行.如果我替换this.route.paramsObservable.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 => { ... },
        () => { ... }
    );
Run Code Online (Sandbox Code Playgroud)

Rob*_*hof 19

我的猜测route.params是永远不会完成的.这就是为什么forkJoin不起作用.你可以用combineLatest而不是forkJoin


Art*_*tem 7

根据这个文档,当所有可观察对象完成时,forkJoin从每个observable中发出最后一个值.

Observable.of({id: 123}) 
Run Code Online (Sandbox Code Playgroud)

将在{id:123}后立即补充

this.route.params
Run Code Online (Sandbox Code Playgroud)

永远不会完成.由于用户在编辑浏览器地址栏时可以更改路径参数.这种变化永远不会停止.

我认为你可以使用take(1)完成observable:

 this.route.params.take(1)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要更改路线参数,请使用combineLatest

Observable.combineLatest(dependentObservable, independentObservable)
Run Code Online (Sandbox Code Playgroud)