【问题标题】:Observable.forkJoin of Angular Route Params ObservableAngular Route Params Observable 的 Observable.forkJoin
【发布时间】:2017-03-10 19:37:32
【问题描述】:

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

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

两个 HTTP 调用总是在执行,但是当我的第一个 observable 连接到 route.params 时,forkJoin(...).subscribe(...) 方法永远不会运行。如果我用Observable.of({id: 1234}) 替换this.route.params 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 => { ... },
        () => { ... }
    );

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    我的猜测是route.params 永远不会完成。这就是forkJoin 不起作用的原因。你可以用combineLatest代替forkJoin

    【讨论】:

    • 为什么它永远不会完成?
    • 因为路线可以改变。
    【解决方案2】:

    根据doc forkJoin,当所有可观察对象完成时,会发出每个可观察对象的最后一个值。

    Observable.of({id: 123}) 
    

    将在给出 {id: 123} 后立即完成

    但是

    this.route.params
    

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

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

     this.route.params.take(1)
    

    或者,如果您想响应路由参数的变化,请使用 combineLatest

    Observable.combineLatest(dependentObservable, independentObservable)
    

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2019-09-22
      相关资源
      最近更新 更多