RxJS v4曾经有一个Observable.transduce
方法,它使用了一个转换器。这样就可以使用过去与库无关的换能器运算符,这些运算符在过去具有很大的性能优势。
来源
RxJS v5.5和v6具有可管道运算符,并且v6删除了方法链。因此,我假设RxJS运算符是标准转换器。查看源代码,似乎并非如此。
RxJS v6运算符的作用类似于换能器,其中每个值在下一个值通过之前就完全通过链传递,但是RxJS v6运算符未使用我在其他库中看到的标准换能器方法,这意味着,我不会认为它们是便携式的。
关于换能器的全部事情是,他们对集合本身一无所知。不必编写100个专门用于可观察对象的运算符,而是可以编写100个普遍适用于任何集合或流类型的运算符。
.pipe
是否与.transduce
一致,还是在RxJS v5中完全删除了此方法?
答案 0 :(得分: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
。 cf.以tests为例。