无论RxJS v5中的“Observable.transduce”发生了什么?

RxJS v4曾经有一个带有传感器的Observable.transduce方法.这允许使用独立于库的换能器操作器,这些操作器在过去具有主要的性能益处.

来源

> https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/transduce.md
> https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/transducers.md
> https://medium.com/front-end-hacking/rxjs-transducers-vs-method-chaining-performance-87561cf4ce65
> https://github.com/ReactiveX/rxjs/pull/1323

RxJS v5.5和v6具有可管道运算符和v6删除方法链接.因此,我假设RxJS运算符是标准传感器.通过源代码查看,情况似乎并非如此.

RxJS v6运算符的功能类似于传感器,其中每个值在下一个值通过之前完全通过链,但RxJS v6运算符不使用我在其他库中看到的标准传感器方法,我不认为它们’便携式.

换能器的全部内容是他们对收集本身一无所知.您可以编写100个普遍适用于任何集合或流类型的运算符,而不是专门为可观察对象编写100个运算符.

.pipe是否与.transduce一致或者是否在RxJS v5中完全删除了此方法?

最佳答案 我有完全相同的问题,无法在任何地方找到答案.是的,你可以管道,但我相信这将为每个操作符创建中间可观察量.我不确定,但这将是关于阅读代码.

所以我提出了自己的转换操作符:

function transformForObserver(o) {
  return {
    "@@transducer/init": function() {
      return o;
    },
    "@@transducer/step": function(obs, input) {
      return obs.next(input);
    },
    "@@transducer/result": function(obs) {
      return obs.complete();
    }
  };
}

    const transduce = (obs, transducer) => {
      const xform = transducer(transformForObserver);

      return Observable.create(o => {
        return obs.subscribe({
          next: x => {
            const res = tryCatch(
              xform["@@transducer/step"],
              err => {
                console.error(`Error occurred in transducer/step!`, err);
                return err;
              }
            )(xform, o, x);

            if (res instanceof Error) { o.error(res); }
          },
          error: err => {
            console.error(`Error occurred in observable passed to Rx transduce fn!`, err);
            o.error(err);
          },
          complete: () => {o.complete();}
        });
      });
    }

还没有测试过,如果有兴趣的话会很快发布.

更新:我分叉了jslongser的tranducers库并在其中包含了这样的传感器. Fork是https://github.com/brucou/transducers.js,函数是transduceLazyObservable.参看以tests为例.

点赞