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

目录

RxJS的另外四种实现方式(序)node

RxJS的另外四种实现方式(一)——代码最小的库git

RxJS的另外四种实现方式(二)——代码最小的库(续)github

RxJS的另外四种实现方式(三)——性能最高的库npm

RxJS的另外四种实现方式(四)——性能最高的库(续)编程

RxJS的另外四种实现方式(五)——使用生成器实现函数

RxJS的另外四种实现方式(六)——使用Stream类实现性能

github地址

https://github.com/langhuihui/rx4rxui

源码对应位置 |库|目录| |--|--| |极小库rx4rx-lite|/stdlib/ |最快库rx4rx-fast|/highlib/ |生成器库|/channel/ |基于Nodejs,Steam类|/nodelib/.net

几种库的实现对比总结(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 fastrxcode

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

针对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只是充当了桥梁做用,实际使用中,并不会影响性能。

相关文章
相关标签/搜索