【问题标题】:RxJS: Depending on previous values to recover an object and then join and emit those previous values with the recovered objectRxJS:根据先前的值来恢复对象,然后将这些先前的值与恢复的对象连接并发出
【发布时间】:2018-09-26 08:27:34
【问题描述】:

我有一个案例,我有一堆从route.params 恢复的 id,如下所示:

const ids$ = this.route.params.pipe(
  map(params => {
    const modelId = +params['modelId'];
    const deliverId = +params['deliverId'];
    const compositionId = +params['compositionId'];

    return { modelId, deliverId, compositionId };
  })
);

之后,我必须从服务器恢复composition对象,所以我这样做:

const getComposition$ = ids$.pipe(
  switchMap(ids =>
    this.compositionsService.getComposition(ids.compositionId)
  )
);

现在我想要一个具有前两个 id 的聚合对象,而不是最后一个 (compositionId),composition 对象,我的意思是:

entities: {
  modelId: number;
  deliverId: number;
  composition: Composition;
};

所以我这样做:

const aggregated$ = forkJoin(ids$, getComposition$).pipe(
  map(arr => ({
    modelId: arr[0].modelId,
    deliverId: arr[0].deliverId,
    aggregated: arr[1]
  }))
);

然后,我订阅它:

const aggregated$.subscribe(aggregated => {
  console.log(aggregated);
});

但它从不在控制台上打印任何内容。有趣的是,如果我检查是否对服务器进行了调用,它实际上是,但最后一个 observable (aggregated$) 从来没有发出任何东西。

我做错了什么?有没有更好的方法来实现这一点?

【问题讨论】:

    标签: angular rxjs angular2-observables


    【解决方案1】:

    正如你所说,ids$getComposition$ 实际上都是来自 Angular 的 this.route.paramsforkJoin 操作符需要其所有源 Observable 至少发出一个项目,并且所有项目都必须完成。这就是您使用 this.route.params 时不会发生的事情,因为它是一个永远不会完成的主题。

    因此您可以使用例如take(1) 来完成ids$getComposition$ 两个来源:

    forkJoin(ids$.pipe(take(1)), getComposition$.pipe(take(1))
      ...
    

    【讨论】:

      【解决方案2】:

      来自 Observable 文档:

      forkJoin:等待 Observables 完成,然后最后合并 他们发出的值。

      我认为在您的情况下 forkJoin 不会发出,因为 ids$ 没有完成。

      你可以尝试的是这些方面的东西

      const getComposition$ = ids$.pipe(
        switchMap(ids =>
          this.compositionsService.getComposition(ids.compositionId).pipe(
             map(composition => ({composition, modelId: ids.modelId, deliverId: ids.deliverId))
          )
        )
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多