RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录

RxJS的另外四种实现方式(序)
RxJS的另外四种实现方式(一)——代码最小的库
RxJS的另外四种实现方式(二)——代码最小的库(续)
RxJS的另外四种实现方式(三)——性能最高的库
RxJS的另外四种实现方式(四)——性能最高的库(续)
RxJS的另外四种实现方式(五)——使用生成器实现
RxJS的另外四种实现方式(六)——使用Stream类实现

github地址

https://github.com/langhuihui/rx4rx

源码对应位置

目录
极小库rx4rx-lite /stdlib/
最快库rx4rx-fast /highlib/
生成器库 /channel/
基于Nodejs,Steam类 /nodelib/

几种库的实现对比总结(TS语法)

生产者 消费者 备注
RxJS Observable Observer
callbag type callbag = (type:number,sink:callbag)=>void callbag type取值0,1,2
rx4rx-lite (n:Next,c:Complete)=>Disposable Next、Complete type Next = (d:any)=>void;type Complete=(err?:Error)=>void;type Disposable=()=>void
rx4rx-fast (sink:Sink)=>void Sink npm install fastrx

同时实现管道和链式编程原理

针对rx4rx-lite、rx4rx-fast 两个库,所有的生产者均为函数,操作符均为返回source:Observable => Observable的高阶函数。
故原生支持管道编程方式同callbag即pipe(ob,op1(……),op2(……),……,subscriber(……))
如果用pipeline operatorb可以写成ob |> op1(……) |> op2(……) |> ……|>subscriber(……)

RxJS5或者更早的版本使用经典的链式编程即ob.op1(……).op2(……).subscribe(……)

那么如何使得两者兼得呢?这是就要让Proxy登场了,先看源码:

const rxProxy = {
    get: (target, prop) => (...args) => new Proxy(exports[prop](...args)(target), rxProxy)
}

exports.rx = new Proxy({}, {
    get: (target, prop) => (...args) => new Proxy(exports[prop](...args), rxProxy),
    set: (target, prop, value) => exports[prop] = value
})

我们导出了一个rx的Proxy对象,比如访问rx.of(1,2,3)。我们会得到什么呢?
首先我们会调用rx的get函数将“of”传入prop参数
得到一个函数

(...args)=>new Proxy(exports["of"](...args),rxProxy)

其中exports["of"]就是我们库里面定义的of生产者
然后将1,2,3传入这个函数得到

new Proxy(exports["of"](1,2,3),rxProxy)

其中exports["of"](1,2,3)就是相当于调用了原始库里面的of(1,2,3)

new Proxy(of(1,2,3),rxProxy)

这就是我们得到的新的Proxy
此时如果我们接着调用filter操作符:rx.of(1,2,3).filter(x=>x>1)

首先相当于调用了rxProxy里面的get方法,传入prop为“filter”,target为of(1,2,3)
得到

(...args) => new Proxy(exports["filter"](...args)(of(1,2,3)), rxProxy)

其中exports["filter"]就是原始库里面的filter操作符,然后传入x=>x>1这个参数,得到

new Proxy(filter(x=>x>1)(of(1,2,3)), rxProxy)

其中filter(x=>x>1)(of(1,2,3))就相当于pipe(of(1,2,3),filter(x=>x>1))

到这里读者应该已经看出来了,后面无论如何调用都会返回相同形式的Proxy对象,可以无限调用下去。
其中Proxy只是充当了桥梁作用,实际使用中,并不会影响性能。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,749评论 0 38
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,801评论 19 139
  • 上个月我去参加一个读书活动,地点在一家早有耳闻的独立书店。这家书店的位置有点难找,在一条支路的街道服务站楼上,书店...
    李金子阅读 3,919评论 6 14
  • CPE(Cost per engagement):按参与付费,这是一种新的关于广告营销的计费方式。所谓的Engag...
    Actimermao阅读 2,890评论 0 0
  • 撕扯着 我的胃 或许也不是某个我的 肠缠连 谁的累 一刀做剪泪人愁 长的夜 星的醉 郁郁眉心何时展
    樊小四阅读 1,603评论 0 0

友情链接更多精彩内容