使用 Rx 中预定义的 Subject
看到一幅有趣的关于 Rx 学习的图,想知道学习 Rx 的学习曲线?不,是峭壁!
我们可以直接通过 Rx 的 Observer 来创建 Observable 对象。
但是,使用这种方式往往比较复杂,在特定的场景下,我们可以直接使用 Rx 提供的特定 Subject 来实现 Observable。这些特定的 Subject 是主题和订阅者的混合体,我们可以直接使用这样的一个对象来实现信息的发布和数据流的订阅。
1. Subject
通用的 Subject,既可以被订阅,从名字也可以看到它本身就是一个主题,所以可以直接用来发布信息。如果需要实现一个普通的主题,它就是最理想的选择。
使用方式:
发布信息的方法:
onNext( value )
发布一个新的值到数据流中。
onCompleted()
数据流终止。
onError( error )
发布异常。
使用示例:
var subject = new Rx.Subject(); var subscription = subject.subscribe(
function (x) {
console.log('Next: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
}); subject.next(42); // => Next: 42 subject.next(56); // => Next: 56 subject.completed(); // => Completed
See Also:
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md
2. AsyncSubject
缓存直到 completed() 的最后一个值。所有的订阅者都会收到同样的最后一个值。
注意只能有一个值,在 completed() 之后,将不能再发布新的值。而所有的订阅者也只能得到最后一个值。
使用方式:
必须使用 completed() 完成流,订阅者将会在 completed() 之后才能得到最后一个值。
使用示例:
var subject = new Rx.AsyncSubject(); var i = 0;
var handle = setInterval(function () {
subject.onNext(i);
if (++i > 3) {
subject.onCompleted();
clearInterval(handle);
}
}, 500); var subscription = subject.subscribe(
function (x) {
console.log('Next: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
}); // => Next: 3
// => Completed
图例
See also: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/asyncsubject.md
3. BehaviorSubject
如果是希望订阅者获得当前的最后一个值,但是后面可能还会提供新的值,可以考虑这个。
缓存已经发布的最后数据,新的订阅者可以接收到最后一个已经发布的值,和以后发布的新的值。
它可以直接设置一个初始值。如果不需要初始值,可以考虑使用 ReplaySubject.
使用方式:
BehaviorSubject(initialValue)
在构造函数中提供初始的值。
getValue()
获取当前的值,或者抛出异常,在调用了 completed() 之后,最后的值被保留。在 error() 之后,总是抛出一个特定的异常。
使用示例
/* Initialize with initial value of 42 */
var subject = new Rx.BehaviorSubject(42); var subscription = subject.subscribe(
function (x) {
console.log('Next: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
}); // => Next: 42 subject.next(56);
// => Next: 56 subject.completed();
// => Completed
图例
See also:
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md
4. ReplaySubject
可以用来缓存流中最后 n 个数据,在新的观察者登记之后,这些缓存的数据直接发布给新的观察者。
使用说明:
在构造 ReplaySubject 对象的时候,配置缓存的数据元素数量以及时间窗口。
ReplaySubject([bufferSize], [windowSize], [scheduler])
使用特定的缓存大小,时间窗口和调度器来创建 ReplaySubject
对象实例.
Arguments
[bufferSize = Number.MAX_VALUE]
(Number): Maximum element count of the replay buffer.[windowSize = NUMBER.MAX_VALUE]
(Number): Maximum time length of the replay buffer.[scheduler = Rx.Scheduler.currentThread]
(Scheduler): Scheduler the observers are invoked on.
使用示例
var subject = new Rx.ReplaySubject(2 /* buffer size */); subject.next('a');
subject.next('b');
subject.next('c'); var subscription = subject.subscribe(
function (x) {
console.log('Next: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
}); // => Next: b
// => Next: c subject.next('d');
// => Next: d
图例
See Also:
http://reactivex.io/rxjs/manual/overview.html#subject
使用 Rx 中预定义的 Subject的更多相关文章
- 五个在XML文档中预定义好的实体
下面是五个在XML文档中预定义好的实体: < < 小于号 > > 大于号 & & 和 ' ' 单引号 " " 双引号 实体 ...
- visual c++中预定义的宏
一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解 ...
- R语言学习笔记(十九):字符串处理中预定义字符组(表格介绍)
R中预定义的字符组 代码 含义说明 [:digit:]或\\d 数字; [0-9] [^[:digit:]]或\\D 非数字; 等价于[^0-9] [:lower:] 小写字母; [a-z] [:up ...
- gcc中预定义的宏__GNUC__
转载:gcc中预定义的宏__GNUC__ - Cccarl - 博客园 (cnblogs.com) 今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以 ...
- PHP中预定义超全局数组(变量)
PHP中许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用.超全局变量除了具有全局变量特点外,在函数或方法中无需执行global $variable:就可以访问它们. 提供超全 ...
- ARM编译器中预定义的宏
arm系列目前支持三大主流的工具链,realview的armcc,iar ewarm的iccarm,gnu的gcc,编译器在编译的时候会预定义一些宏,这些宏在工程中起到不可或缺的作用. 例如 /* d ...
- PHP基础-PHP中预定义的超全局数组
预定义数组: 自动全局变量---超全局数组 1. 包含了来自WEB服务器,客户端,运行环境和用户输入的数据 2. 这些数组比较特别 3. 全局范围内自动生效,都可以直接使用这些数组 4. 用户不能自定 ...
- OSG学习:使用OSG中预定义的几何体
常用的内嵌几何体包括: osg::Box //正方体 osg::Capsule //太空舱 osg::Cone //椎体 osg::Cylinder //柱体 osg::HeightField //高 ...
- Oracle中预定义角色有哪些?
1. CONNECT 2. RESOURCE 3. DBA 4. EXP_FULL_DATABASE 5. IMP_FULL_DATABASE 6. DELETE_CATALOG_ROLE 7. EX ...
随机推荐
- codeforces #262 DIV2 C称号Present(二分法+贪婪)
职务地址:http://codeforces.com/contest/460/problem/C 这个题是用二分枚举最小值.然后推断是否能在规定的次数内使得全部的数都达到这个值.推断的时候要用贪心的方 ...
- MySQL之 ALTER vs CHANGE vs MODIFY COLUMN
1.ALTER COLUMN 用于设置或者移除某一列的默认(缺省)值, 1.1用法 ALTER TABLE MyTable ALTER COLUMN foo SET DEFAULT 'bar'; AL ...
- 在希望的田野上--生物柴油(Biodiesel)光明的未来
请看下图: 这是科学家Bernie Tao教授给美国Purdue大学的学生们出的题目"有关大豆.谷物产品的创新竞赛",实质上,就是鼓舞研究.开发及应用生物柴油(Biodiesel) ...
- RESTful API Develop
yii2 RESTful API Develop 参考文档:http://www.yiiframework.com/doc-2.0/guide-rest.html 以 DB 中的 news 表为例 ...
- PushSharp的使用
PushSharp的使用 最近做公司的一个项目.一旦数据库插入新的消息,就要通知服务器,将这些新的消息推送给苹果客户端,以前我们的项目中有人做过这个功能,无奈做的有点复杂,而且代码没注释,我压根就没看 ...
- BrnShop:自定义插件
BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...
- Effective C++(18) 让接口更容易被正确使用,不易被误用
问题聚焦: 从这个条款开始,我们把注意力转移到软件设计和声明上来,具体的说就是,C++接口的设计和声明. 所谓软件设计,就是以一般习惯的构想开始,演变成细节的实现,最终开发针对性的特殊 ...
- Memcached快递上手之C#
Memcached快递上手之C# Memcached是开源高性能分布式缓存组件,目前已经广泛应用各类互联网领域. 具有多种语言的客户端开发包,包括:Perl/PHP/JAVA/C/Python/Rub ...
- iOS基础 - CALayer
一.CALayer简介 Core Animation是跨平台的,支持iOS环境和Mac OS X环境 凡是支持跨平台的框架,都不能直接使用UIKit框架,因为UIKit框架只能应用在iOS而不能用于M ...
- 在一般处理文件中访问Session需要添加IRequiresSessionState
在IHttpHandler 使用Session 通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但 ...