使用 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: 42subject.next(56);// => Next: 56subject.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: 42subject.next(56);// => Next: 56subject.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: csubject.next(‘d‘);// => Next: d

时间: 2024-09-29 18:00:06

使用 Rx 中预定义的 Subject的相关文章

visual c++中预定义的宏

一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解,在实际编码中可以考虑使用部分宏作为判断标准. 主要参考链接:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.100).aspx 二.vc++ 2010中预定义宏 注意本文中提及的所有预定义宏都是无参数的,并且不能重定义. 1. __FIL

gcc中预定义的宏__GNUC__

今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以此记录.GNU C预定义了一系列的宏,这些宏都是以双下划线开始的,这里只讲一下__GNUC__  __GNUC_MINOR__ __GNUC_PATCHLEVEL__,其他GNU C的预定义宏可以到这里查看: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/cpp/Common-Predefined-Macros.html#Common-Predefined-Ma

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

预定义数组: 自动全局变量---超全局数组 1. 包含了来自WEB服务器,客户端,运行环境和用户输入的数据 2. 这些数组比较特别 3. 全局范围内自动生效,都可以直接使用这些数组 4. 用户不能自定义这些数组, 但这些数据操作方式又和我们自定义的数组操作方式一样 5. 在函数中直接可以使用这些数组 $_GET //经由URL请求提交至脚本的变量,表单默认提交方式和链接提交方式 $_POST //经由HTTP POST 方法提交到脚本的变量 $_REQUEST //经由GET, POST和COO

C++中预定义的宏

以下信息摘自与标准C++的文档中. 如果把这些宏加在程序的日志中,它将为开发人员进行问题分析提供了很好的帮助. standard c++ 1998版The following macro names shall be defined by the implementation:__LINE__ The line number of the current source line (a decimal constant).__FILE__ The presumed name of the sour

PHP中预定义的超全局数组

我们先来了解一下什么是超全局数组: 自动全局变量----超全局数组 1.包含了来自web服务器,客户端,运行环境和用户输入的数据 2.这些数组是特别的 3.全局范围内自动生效,都可以直接使用这些数组,前面无需加global 4.用户不能自定义这些数组 接下来我们看看有哪些超全局数组: $_GET:由URL请求提交至脚本的变量 $_POST:由HTTP POST 方法提交到脚本的变量 $_REQUEST:由GET.POST.COOKIE机制提交到脚本的变量,因此该数组并不值得信任,尽量不去使用 $

XML预定义的实体

在TSQL读取XML中一些特定的字符时出错,在XML中有些自付要用实体: 下面是五个在XML文档中预定义好的实体: < < 小于号 > > 大于号 & & 和 &apos; ' 单引号 " " 双引号 实体必须以符号"&"开头,以符号";"结尾. 注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的.剩下的都是合法的,为了减

C#预定义类型

C#提供了16中预定义类型,其中包括13种简单类型和三种非简单类型: 所有预定义类型的名称全部由小写字母组成.预定义的简单类型包括以下3种:11种数值类型.一种Unicode字符类型char.一种布尔类型bool 三种非简单类型如下:string,它是一个Unicode字符数组:object,它是所有其他类型的基类:dynamic,使用动态语言编写的程序集时使用.

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme

C标准中一些预定义的宏,如__FILE__,__func__等

C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __FILE__ 代表当前源代码文件名的字符串文字 __LINE__ 代表当前源代码中的行号的整数常量 __TIME__ 源文件编译时间,格式微“hh:mm:ss” __func__ 当前所在函数名 对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因