【问题标题】:Whatever happened to `Observable.transduce` in RxJS v5+?RxJS v5+ 中的 Observable.transduce 发生了什么?
【发布时间】:2019-04-26 04:46:21
【问题描述】:

RxJS v4 曾经有一个采用传感器的Observable.transduce 方法。这允许使用独立于库的传感器操作符,这在过去具有重大的性能优势。

来源

RxJS v5.5 和 v6 具有可管道操作符,并且 v6 删除了方法链。因此,我假设 RxJS 操作符是标准转换器。翻看源代码,好像不是这样的。

RxJS v6 运算符的功能类似于一个转换器,其中每个值在下一个值通过之前完全通过链传递,但是 RxJS v6 运算符没有使用我在其他库中看到的标准转换器方法,意思是,我不'不认为它们是便携式的。

关于传感器的全部内容是它们对集合本身一无所知。您可以编写 100 个普遍适用于任何集合或流类型的运算符,而不是专门为 observable 编写 100 个运算符。

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

【问题讨论】:

    标签: rxjs method-chaining pipelining transducer


    【解决方案1】:

    我有完全相同的问题,但在任何地方都找不到答案。是的,您可以pipe,但我相信这将为每个操作员创建中间可观察对象。不过我不确定,这将是关于阅读代码。

    所以我想出了自己的transduce 运算符:

    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 的转换器库,并在其中包含了此类转换器。分叉是https://github.com/brucou/transducers.js,函数是transduceLazyObservable。参照。 tests 使用举例。

    【讨论】:

    • 扩展与其他传感器库的兼容性会很好。
    • 不知道你的意思。如果这就是您所指的,这将遵循传感器协议。
    • 是的。所以它允许与它一起使用其他库!
    • 出于好奇,性能优势有多好?可用于 javascript 的转换器非常有限。例如,我正在寻找startWith,我正在写一个。
    • 测试了可观察传感器并添加到库中。你可以看看。通过该功能,您应该能够将其放在原型上或按原样使用它。为它工作的存储库加注星标,如果没有,则将问题留在那里。我只在本地测试过。
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2014-02-28
    • 2010-10-02
    • 2020-03-14
    • 2011-04-09
    相关资源
    最近更新 更多