看到一幅有趣的关于 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

  1. [bufferSize = Number.MAX_VALUE] (Number): Maximum element count of the replay buffer.
  2. [windowSize = NUMBER.MAX_VALUE] (Number): Maximum time length of the replay buffer.
  3. [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的更多相关文章

  1. 五个在XML文档中预定义好的实体

    下面是五个在XML文档中预定义好的实体: < < 小于号 > > 大于号 & & 和 &apos; ' 单引号 " " 双引号 实体 ...

  2. visual c++中预定义的宏

    一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解 ...

  3. R语言学习笔记(十九):字符串处理中预定义字符组(表格介绍)

    R中预定义的字符组 代码 含义说明 [:digit:]或\\d 数字; [0-9] [^[:digit:]]或\\D 非数字; 等价于[^0-9] [:lower:] 小写字母; [a-z] [:up ...

  4. gcc中预定义的宏__GNUC__

    转载:gcc中预定义的宏__GNUC__ - Cccarl - 博客园 (cnblogs.com) 今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以 ...

  5. PHP中预定义超全局数组(变量)

    PHP中许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用.超全局变量除了具有全局变量特点外,在函数或方法中无需执行global $variable:就可以访问它们. 提供超全 ...

  6. ARM编译器中预定义的宏

    arm系列目前支持三大主流的工具链,realview的armcc,iar ewarm的iccarm,gnu的gcc,编译器在编译的时候会预定义一些宏,这些宏在工程中起到不可或缺的作用. 例如 /* d ...

  7. PHP基础-PHP中预定义的超全局数组

    预定义数组: 自动全局变量---超全局数组 1. 包含了来自WEB服务器,客户端,运行环境和用户输入的数据 2. 这些数组比较特别 3. 全局范围内自动生效,都可以直接使用这些数组 4. 用户不能自定 ...

  8. OSG学习:使用OSG中预定义的几何体

    常用的内嵌几何体包括: osg::Box //正方体 osg::Capsule //太空舱 osg::Cone //椎体 osg::Cylinder //柱体 osg::HeightField //高 ...

  9. Oracle中预定义角色有哪些?

    1. CONNECT 2. RESOURCE 3. DBA 4. EXP_FULL_DATABASE 5. IMP_FULL_DATABASE 6. DELETE_CATALOG_ROLE 7. EX ...

随机推荐

  1. IntelliJ IDEA 13 破解安装(JRebel 5.6.3a皴)

    首先安装IntelliJ 13,记住下载Ultimate Edition版本号,否则就必须打破..   安装到本地.然后一些配置(这一步不能.不过考虑到交换系统后,保存,建议做) 打开{install ...

  2. Java 多线程之内存一致性错误

    当不同的线程针对相同的数据却读到了不同的值时就发生了内存一致性错误.内存一致性错误的原因是非常复杂的.幸运的是我们程序员不需要详细的理解这些原因,我们需要做的事情就是使用策略来规避这些. 避免内存一致 ...

  3. LibVLC video controls

    原文 http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html VLC  3.0.0-git ...

  4. 在Ubuntu下直接通过SSH登录到OpenWrt

    先前一直使用的是putty,这个工具会另外打开一个x-term来显示,界面较难看点. 刚刚测试使用Ubuntu自己的SSH,很简便,命令为:(root为主机名,10.0.11.233为主机地址) ss ...

  5. Redis源代码分析(二十四)--- tool工具类(2)

    在上篇文章中初步的分析了一下,Redis工具类文件里的一些使用方法,包含2个随机算法和循环冗余校验算法,今天,继续学习Redis中的其它的一些辅助工具类的使用方法.包含里面的大小端转换算法,sha算法 ...

  6. 笔试 - 高德软件有限公司python问题 和 答案

    高德软件有限公司python问题 和 答案 本文地址: http://blog.csdn.net/caroline_wendy/article/details/25230835 by Spike 20 ...

  7. ToolBox Analysis & Design

    话说小菜过做已近3年,虽出身PHP后项目大多涉及.net,系统也做得比较繁杂,从常见的CMS,企业OA,ERP,也涉及到电商系统的开发定制,爬虫,工具不一而足,其中web系统居多. 由于表现良好,时常 ...

  8. 通过Func 委托理解委托和匿名方法及Lambda 表达式

    Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...

  9. Build FFmpeg for iOS

    FFmpeg Build Instructions MAC 10.8 or better Copy ffmpeg-2.0.tar.bz2 (https://ffmpeg.org/releases/ff ...

  10. 企业架构研究总结(32)——TOGAF架构内容框架之架构交付物

    3. 架构交付物(Architecture Deliverables) 架构交付物是在整个架构开发方法循环过程中所产生或被使用的契约性且正规化的企业架构内容,因而其与企业架构开发方法有着紧密的联系.本 ...