文档章节

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

一个灰
 一个灰
发布于 2018/09/16 15:32
字数 772
阅读 29
收藏 0

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

上篇我们展示了生产者interval和操作符filter的实现,接下来我们看一下消费者subscriber的实现

callbag的实现

const subscribe = (listener = {}) => source => {
  if (typeof listener === "function") {
    listener = { next: listener };
  }

  let { next, error, complete } = listener;
  let talkback;

  source(0, (t, d) => {
    if (t === 0) {
      talkback = d;
    }
    if (t === 1 && next) next(d);
    if (t === 1 || t === 0) talkback(1);  // Pull
    if (t === 2 && !d && complete) complete();
    if (t === 2 && !!d && error) error( d );
  });

  const dispose = () => {
    if (talkback) talkback(2);
  }

  return dispose;
}

module.exports = subscribe;

最小库的实现

exports.subscribe = (n, e, c) => source => source(n, err => err ? e && e(err) : c && c())

我们可以看到,如果让读者自行扩展其他操作符或者生产者都是十分容易的。相反如果要写出正确的callbag的话,就十分考验技术了。

大家可以自行验证两个库的运行情况是否正确:

//pipe语法
interval(1000) |> filter(x => x > 4) |> subscribe(console.log)
//使用pipe函数代替
pipe(interval(1000),filter(x => x > 4) ,subscribe(console.log))

最后再展示一个skip操作符的实现源码

exports.skip = count => source => (n, c) => {
    let _count = count;
    let _n = () => (--_count === 0 && (_n = n));
    return source(d => _n(d), c)
}

最小库实现技术手段

与callbag相似,最小库使用高阶函数来代替传统的observable、observer等对象,所以不需要核心库(基类)。传统方式在创建observable的时候传入observer对象,作为代替方案,是向observable高阶函数传入next和complete回调函数作为订阅行为。next和complete回调函数合起来可以看成是observer对象。而observer分成了next和complete回调函数的好处是,可以进行分开传递,有时候就可以直接透传,如上文的skip函数中的complete回调函数c,直接透传到源observable里面。订阅行为即调用observable函数返回值被利用来作为dispose行为,很多时候就会隐含的进行传递如上面的skip操作符。js的许多语法可以使得代码更加短小精悍,例如:

  • 箭头函数为表达式的时候,无需写大括号,以及return
  • js的逗号表达式,可以返回表达式最后一个逗号后面的值
  • js的逻辑运算符&&、||可以用来代替if语句等
  • js的函数变量可以替换成新的函数,使得行为发生变化

当然这个库最核心的就是函数闭包,本质上来说,定义函数就相当于定义了一个类,闭包里面的变量都是这个函数调用后的伪对象的属性,这导致了,虽然代码已经极端短小,但性能却不是最高的原因。下一篇我将介绍最高性能的库的实现方法。

(未完待续)

© 著作权归作者所有

共有 人打赏支持
一个灰
粉丝 26
博文 31
码字总数 20021
作品 3
南京
高级程序员
私信 提问
RxJS的另外四种实现方式(序)

本文适合人群:了解Rx编程人士、发烧友 - 本文涉及概念:响应型编程、NodeJs、函数式编程 背景 本人自从读过一篇来自Info的《函数式反应型编程(FRP) —— 实时互动应用开发的新思路》后便迷恋...

一个灰
2018/09/15
0
2
RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录 RxJS的另外四种实现方式(序) RxJS的另外四种实现方式(一)——代码最小的库 RxJS的另外四种实现方式(二)——代码最小的库(续) RxJS的另外四种实现方式(三)——性能最高的库 Rx...

一个灰
2018/09/24
0
0
RxJS的另外四种实现方式(三)——性能最高的库

接上篇 RxJS的另外四种实现方式(二)——代码最小的库(续) 代码最小的库虽然在性能测试中超过了callbag,但和most库较量的时候却落败了,于是我下载了most库,要解开most库性能高的原因。...

一个灰
2018/09/18
0
0
高手问答第 200 期 — 兼具函数式和响应式编程的 RxJS,了解一下?

OSCHINA 本期高手问答(2018 年 6 月 5 日 — 6 月 11 日)我们邀请到了程墨老师@程墨Morgan 和大家一起讨论关于 RxJS 的问题。 程墨,资深架构师,曾任职于摩托罗拉、雅虎和微软,云鸟配送平台...

局长
2018/06/04
2.9K
26
[译] 使用响应式编程来实现简易版的无限滚动加载

原文链接: hackernoon.com/naive-infin… 本文为 RxJS 中文社区 翻译文章,如需转载,请注明出处,谢谢合作! 如果你也想和我们一起,翻译更多优质的 RxJS 文章以奉献给大家,请点击【这里】...

SangKa
2018/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部