合并多个流的combineLatest操作已被@deprecated,不再支持resultSelector参数,建议改用管道操作map来替代?

9
Angular Material 文档应用程序中包含以下代码段:
    // Combine params from all of the path into a single object.
    this.params = combineLatest(
      this._route.pathFromRoot.map(route => route.params),
      Object.assign);

TSLint在使用combineLatest时会给出以下提示:

@deprecated — resultSelector不再受支持,请改用管道(pipe)到map

应该如何解决这个问题呢?

如果您了解所使用的技术,一个简单的例子并加以阐述将非常棒。

这里有一个代码链接:

https://github.com/angular/material.angular.io/blob/master/src/app/pages/component-category-list/component-category-list.ts

3个回答

4
combineLatest(observables, resultSelector)

可以经常替换为

combineLatest(observables).pipe(
  map(resultSelector)
)

但是,这是否能够以同样的方式工作,取决于您的resultSelector接受哪些参数。 combineLatest(observables) 会发出一个数组,而在使用已弃用的resultSelector时,RxJs 会自动展开此数组

return isArray(args) ? fn(...args) : fn(args); // fn is your resultSelector

Object.assign 根据提供的参数类型不同,返回值也不同,因此您需要手动展开数组。

combineLatest(observables).pipe(
  map(items => Object.assign({}, ...items))
)

2

结果选择器只是一个函数,可用于更改输出的形状。

因此,您可以简单地省略结果选择器参数并使用映射来转换形状:

    this.params = combineLatest(
      this._route.pathFromRoot.map(route => route.params)
    ).pipe(
        map(Object.assign)
    );

结果选择器的常见用途(至少对我来说)是将数组作为具有命名属性的对象返回,例如:

// 旧的方式

myObs$ = combineLatest(
   [src1$, src2$, src3$], 
   ([src1, src2, src3]) => ({src1, src2, src3})
);

// 新方式

myObs$ = combineLatest(src1$, src2$, src3$)
    .pipe(
       map(([src1, src2, src3]) => ({src1, src2, src3}))
    );

我克隆了源代码并尝试运行它,但它停止渲染了。有什么想法吗? - Ole
1
你的意思是这个可观察对象不再发出信号了吗?编辑:我刚看到@fridoo的答案 :-) - BizzyBob

1

pipe操作符可以用来将结果传递给map操作符,类似于:

combineLatest(this._route.pathFromRoot.map(route => route.params)).pipe(
  map(Object.assign)
);

参考

此外,我不确定代码的意图,因为它似乎在一个新的数组引用上调用了Object.assign,不确定为什么需要这样做,但这并不完全相关。


是啊...我也不太理解Object.assign的意图...仅仅看代码,好像他们可以直接这样做:this.params = this._route.pathFromRoot.map(route => route.params)... - Ole
我在问题中添加了我认为他们可以做的事情...你觉得有什么问题吗? - Ole
我并不是非常熟悉那个库中的所有细节,但使用 Object.assign 似乎有些不合适,也许我缺少一些上下文信息。 - Evan Trimboli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接