DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师。
官方网站:devui.design
Ng组件库:ng-devui(欢迎Star)
官方交流群:添加DevUI小助手(微信号:devui-official)进群
DevUIHelper插件:DevUIHelper-LSP(欢迎Star)
前言
ReactiveX 是 Reactive Extensions 的缩写,一般简写为 Rx ,最初是 LINQ 的一个扩展,由微软的架构师 Erik Meijer 领导的团队开发,在2012年11月开源。Rx 是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。
首先,先给出官方对于 Rx 的定义。
ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.
翻译起来有点麻烦,简而言之,就是基于观察者队列实现了对异步和基础事件的编程。
Rxjs 是 Rx 的 JavaScript 的实现。本篇文章将简单的分析一下 Obersvable 和 Subscription 的源码是怎么进行的。
Observable
可观察对象是整个 Rx 的核心,主要的作用就是提供了一个观察者模式,使得调用者可以通过响应式的方式获取数据。
Observable 实际上就是一个单向链表,基本的数据结构如下:
class Observable<T> {
source: Observable<any>;
}
其构造方法与 Promise 类似,通过传入一个函数包裹操作,并让这个函数来决定数据传递,这个函数的参数包含了一个订阅器。
const observable = new Observable((subscriber) => {
subscriber.next(1);
subscriber.error(Error('error message'));
subscriber.complete();
});
订阅器提供了三个主要方法:next
,error
,complete
。订阅器的实现很巧妙,其内部实现是一个链表。
跟 Promise 不同,Observable 不会立刻运行这个函数,而是等到它被订阅后,这个函数才会被执行,这种惰性求值的特性使得 Observable 可以在它仅被需要的地方进行计算。
lift
lift
方法提供了一个这样的功能,传入一个映射函数,并返回一个新