为什么一些RxJS 6操作符使用谓词和投影/选择器?

为什么一些RxJS 6操作符使用谓词和投影/选择器?,rxjs,Rxjs,这是一个关于RxJS 6设计的问题。以两个算符为例, 将投影或选择器(在文档的不同区域由不同名称调用)作为可选参数,即从输入可观测值映射到返回可观测值类型的函数 大概,combinelateest([as,bs],f)与combinelateest([as,bs]).pipe(map(f))相同 将一个谓词作为(可选)参数,该谓词可用于从源可观察对象中筛选值 大概,source.pipe(last(p))与source.pipe(filter(p),last())相同^一, 考虑到这些等价性

这是一个关于RxJS 6设计的问题。以两个算符为例,

  • 将投影或选择器(在文档的不同区域由不同名称调用)作为可选参数,即从输入可观测值映射到返回可观测值类型的函数

    大概,
    combinelateest([as,bs],f)
    combinelateest([as,bs]).pipe(map(f))相同

  • 将一个谓词作为(可选)参数,该谓词可用于从源可观察对象中筛选值

    大概,
    source.pipe(last(p))
    source.pipe(filter(p),last())
    相同^一,

  • 考虑到这些等价性,为什么还要使用额外的选择器和预测呢?这样违反单一责任原则有什么好处

    ^1:差不多
    last
    将可观察到的源传递给谓词,但
    filter
    不传递。大多数谓词都不需要该参数,少数使用该参数的谓词可以使用一些管道体操:

    source.pipe(src => {
      const p2 = (value, index) => p(value, index, src)
      return filter(p2)(src)
    })
    

    周围有些人参与了Rxjs V6 API的设计。它们可以补充这个答案


    我猜
    combineLatest([as,bs],f)
    combinelateest([as,bs]).pipe(map(f))具有性能优势。这至少是RXJSV4中的基本原理。在v6中可能会继续如此<代码>管道
    通过直接传递谓词引入了您没有的间接级别,这可能会导致性能降低。类似地,
    obs.pipe(f,g)
    的性能应该低于
    obs.pipe(x=>g(f(x))
    。与往常一样,在绩效方面,衡量就是一切,这将是你在完成所有其他工作后想要做的一种微观优化。

    现在我已经回答了你的问题,我还需要提醒你,因此,请尽量远离那些答案基于观点的问题,原因显而易见。你的问题很快就结束了,这并不奇怪。RXjs有一个可以自由提出此类问题的平台。结果选择器在RxJS 6中已经被弃用,并将在RxJS 7中删除。原因如下所述