李志華

2 分钟介绍 Rx

李志華 · 2016-12-20翻译 · 639阅读 原文链接

你可能已经看过我前段时间写的这篇教程。太长了?好吧。Rx 其实并不难,你可以自己创造一个。请阅读接下来的内容。

你了解数组吗?当然了解。这里就是一个数组:

[ 14, 9, 5, 2, 10, 13, 4 ]

如果我告诉你这个数组不可改变,并且你需要去掉所有奇数(保留偶数),你应该怎么做?下面就是一种常见的方式:

[ 14, 9, 5, 2, 10, 13, 4 ]

filter( (x) -> x % 2 == 0 )

[ 14, 2, 10, 4 ]

到目前为止还没有讲新内容。大家已经在 underscore.js, ECMAScript 5.1, LINQ, Guava 等非常熟悉了。这些都来自函数式编程。


现在思考带有光标坐标数据的点击事件吧。如果你将它们绘制在时间线上,你可能看到就像下图。

我的朋友,这就是事件流(stream of events),俗称"Observable"。

点击事件来自于鼠标,所以事件流是完整不可改变的,也就是说:事件流在定义完成后,是无法新增和删除事件流的。

但是如果我只对那些 x 坐标小于 250 (x < 250) 的点击事件感兴趣呢?那么我们能不能通过过滤数组来创建一个新的数据流(stream)?

filter( (event) -> event.x < 250 )

那么,不可变数组(immutable array)和事件流(Observable)之间的区别在哪?其实两者之间的差别并不大。你可以对它们都使用 map, filter, reduce。你也可以额外对 Observable 使用 merge, delay, concat, buffer, distinct, first, last, zip, startWith, window, takeUntil, skip, scan, sample, amb, join, flatMap

可以把 Observable 看做异步的不可变数组

类比 underscore.js 对数组的用途,Rx 就是用于异步事件数组的 underscore。但是,请等一下,什么是事件?嗯,应用程序中多数事情难道不都是事件吗?

“应用程序已启动”是事件,“API 响应已返回”是事件,“键盘按键按下”是事件,“无效布局”是事件,“设备休眠”是事件,等等。这些都是事件。

事实上任何事情都可以是事件流。问题关键在于你如何组织事件。

这就是 2 分钟简述 Rx。

数组和事件之间的区别是什么? — Erik Meijer

相关文章