资讯专栏INFORMATION COLUMN

rxjs5升级 rx.js6 中的函数式深入

HelKyle / 500人阅读

摘要:最近组内的在做的升级,这当中也涉及到了的升级。所以这也是今天要说的一个重点,的实现,是这次版本升级最根本的地方。

最近组内的angular在做4->6的升级,这当中也涉及到了rxjs的升级。rxjs升级guide链接以下是记录的一些rxjs的升级小tips

6版本有非常多的break points,总结下来为以下三点:

比较多的引用路径变更

一些方法,函数增弃

chainable==>pipeable

以上几点,在具体实践上,1和2根据api,以及rx提供的升级检查工具,都能比较愉快的完成,但比较有意义的第3点,作为一个对函数式编程感兴趣的前端码农,当然要研究一下原委。

其实1和2都有点为第三点服务的意思,我们先简单说下1和2。引用路径的变更,意味着源码目录结构的调整(这些大家可以下载源码,自行看下);同时,原来的rx也采用了和underscore、lodash一样的导出方式,在写法上,满足chainable,所以用rx5时,我们是这样写的:

 var Rx = require("rxjs");
     const Observable = Rx.Observable;
     Observable.range(1,10)
         .filter(x => x % 2 === 0)
         .map(x => x + x)
         .subscribe(x=> console.log(x))

v5的rx导出了一个核心对象Observable以及若干的附属类型对象,然后方法(自有方法(create、subscribe等),以及一些常用的操作符(map、fileter等))定义在这些对象的prototype上,所以这种定义方式搞起链式调用就666,这种实现不影响其本质上的函数式,但在写法上其实是面向对象的伪函数式,但但是奇奇怪怪的,老是搞对象是什么鬼,说好的FP呢。

所以这也是今天要说的一个重点,chainable-->pipeable的实现,是rx这次版本升级最根本的地方。在内部实现上,把原有的操作符都函数化,同时在Observable上新增了pipe方法,以下是pipe.ts中的pipe实现

export function pipe(...fns: Array>): UnaryFunction {
  return pipeFromArray(fns);
}

/* @internal */
export function pipeFromArray(fns: Array>): UnaryFunction {
  if (!fns) {
    return noop as UnaryFunction;
  }

  if (fns.length === 1) {
    return fns[0];
  }

  return function piped(input: T): R {
    return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input);
  };
}

熟悉FP的同学会发现,这个pipe其实是一个从左向右执行的compose,只不过它接受的第一个参数是this,即当前Observable实例,所以我们第一个例子在v6中得这么写:

import { range } from "rxjs/observable/range";
import { map, filter } from "rxjs/operators";


range(0, 10).pipe(
    filter(x => x % 2 === 0),
    map(x => x + x)
).subscribe(x=> console.log(x))

上例pipe做的事情等同于:mapFn(filterFn(range(0,10)))

chainable==>到pipeable,在写法上是一次更加彻底的函数式实践。

当然这种方法->函数的更改,还有一些更大的好处:

打包时的按需引入,tree-shake

更好的用户自定义:更安全(避免对象prototype定义的全局污染),更方便

写法上更函函数式:方便用户进行函数的compose,curry操作,呼应2的更方便的自定义

其它更详尽的点,可参考:

rx团队的说明

原文来自:https://zhuanlan.zhihu.com/p/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96519.html

相关文章

  • rxjs5.x】Transformation操作符

    摘要:对对象发出的每个值,使用指定的函数,进行映射处理。示例图以上代码运行后,控制台的输出结果缓冲源对象已发出的值,直到大小达到给定的最大。该操作符也会先处理前一个对象,在处理下一个对象。 map 对 Observable 对象发出的每个值,使用指定的 project 函数,进行映射处理。 var source = Rx.Observable.interval(1000); var newe...

    isaced 评论0 收藏0
  • rxjs5.x】filter操作符

    摘要:操作符防抖动,只有当另一个发射值时,才取源的最新数据进行发射,其他数据取消发射。输出从源数据集的第一项开始进行发射,直到另一个开始发射第一个值时,源停止发射值。 rxjs5.x filter操作符api debounce 防抖动,只有当另一个Observable发射值时,才取源Obervable的最新数据进行发射,其他数据取消发射。 // 每次点击,且当计时器的最新值未被发射时,才从计...

    Forelax 评论0 收藏0
  • 从命令到响应(四)

    摘要:使用的操作符这条从左到右的横线代表经过操作符转换后的输出流。返回值通过判定函数检测的值组成的流。返回值持续发出输入流上的值,直到通知流上发出值为止。 上期介绍过了rxjs中的三大件,Observable,subscription,subject,但是在开发过程我们最常接触到的东西非操作符莫属。比如上期代码中曾出现过的from就是一个操作符。rxjs中的操作符大致上可以分为几类,创建类,...

    jaysun 评论0 收藏0
  • 2017-06-27 前端日报

    摘要:前端日报精选漫谈函数式编程一十年踪迹的博客前端每周清单的优势与劣势有望超越在嵌入式及物联网的应用现状进阶系列高阶组件详解一前端之路译如何充分利用控制台掘金程序猿升级攻略众成翻译中文译如何充分利用控制台掘金前端从强制开启压缩探 2017-06-27 前端日报 精选 漫谈 JS 函数式编程(一) - 十年踪迹的博客前端每周清单: Vue的优势与劣势;Node.js有望超越Java;JS在嵌...

    Eidesen 评论0 收藏0
  • 专访 | Angel团队负责人黄明:历时半年,腾讯Angel为了开源都经历了些什么?

    摘要:详见腾讯正式版发布基于与的机器学习高性能计算平台在谈及新一代平台时,黄明表示,是此次平台升级的一大亮点,而只是生态圈的第一个成员。对此,黄明表示,在的开发过程中,我们一直都是在同和对标性能。 机器之心原创 作者:高静宜 2017 年 6 月 16 日,腾讯新一代高性能计算平台 Angel 在 Github 上低调开源。开源两周,这个项目在 Github 上持续得到关注,截至目前为止,已...

    William_Sang 评论0 收藏0

发表评论

0条评论

HelKyle

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<