创建型Operators
# 创建型Operators
对于任何数据的处理或使用来说,我们首先会去关注的莫过于,它从哪里来,如何产生的,以及我们该怎么获取。
# create
定义:
public static create(onSubscription: function(observer: Observer): TeardownLogic): Observable
经过前面代码的洗礼,相信大家对该操作符已经不陌生了。
create
将onSubscription
函数转化为一个实际的Observable
。每当有人订阅该Observable
的时候,onSubscription
函数会接收Observer
实例作为唯一参数执行。onSubscription
应该 调用观察者对象的next
,error
和complete
方法。
官方文档的描述其实已经很清晰了,相当于只要有人订阅该操作符创建出来的Observable
,它则会通过调用订阅者本身的方法传递一系列值。
上图与演示代码并无直接关联。
const source = Rx.Observable.create(((observer: any) => {
observer.next(1);
observer.next(2);
setTimeout(() => {
observer.next(3);
}, 1000)
}))
// 方式一
source.subscribe(
{
next(val) {
console.log('A:' + val);
}
}
);
// 方式二
source.subscribe((val) => console.log('B:' + val));
// A:1
// A:2
// B:1
// B:2
//- 1s后:
// A:3
// B:3
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
打印结果自然是不用多提了,首先A
和B
都会分别打印,1、2,并在1s后打印出3。
这里我们可以注意一下,我们的在调用subscribe
的时候可以使用这两种方式,以一个对象形式,该对象具备next
、error
、complete
三个方法(都是可选的),或者直接传入函数的方式,参数前后分别为next
、error
、complete
。
# empty
定义:
public static empty(scheduler: Scheduler): Observable
顾名思义,该操作符创建一个什么数据都不发出,直接发出完成通知的操作符。
这里可能会有读者问了,那这玩意有啥用。
其实不然,在与某些操作符进行配合时,它的作用还真不可小觑,比如mergeMap
,后面会进行配合讲解,等不及的小伙伴可以直接跳到mergeMap
。
# from
定义:
public static from(ish: ObservableInput<T>, scheduler: Scheduler): Observable<T>
从一个数组、类数组对象、Promise
、迭代器对象或者类 Observable
对象创建一个 Observable
.
该方法就有点像js
中的Array.from
方法(可以从一个类数组或者可迭代对象创建一个新的数组),只不过在RxJS
中是转成一个Observable
给使用者使用。
const source = Rx.Observable.from([10, 20, 30]);
source.subscribe(v => console.log(v));
// 10
// 20
// 30
2
3
4
5
6
从示例代码来看,其实这个还是比较简单的用法,如果说你想对现有项目的一些数据(比如数组或类数组)采用RxJS
来管理,那么from
操作将是一个不错的选择。
# fromEvent
定义:
public static fromEvent(target: EventTargetLike, eventName: string, options: EventListenerOptions, selector: SelectorMethodSignature<T>): Observable<T>
创建一个 Observable
,该 Observable
发出来自给定事件对象的指定类型事件。可用于浏览器环境中的Dom
事件或Node
环境中的EventEmitter
事件等。
假设我们有一个这样的需求,监听按钮点击事件,并打印出来:
const click = Rx.Observable.fromEvent(document.getElementById('btn'), 'click');
click.subscribe(x => console.log(x));
2
对比我们使用addEventListener
方式来监听是不是这种写法更为流畅。
# fromPromise
定义:
public static fromPromise(promise: PromiseLike<T>, scheduler: Scheduler): Observable<T>
从命名上看其实已经很明显了,就是将Promise
转换成Observable
,这样我们在编写代码时就可以不用写.then
、.catch
之类的链式调用了。
如果 Promise resolves
一个值, 输出 Observable
发出这个值然后完成。 如果 Promise
被 rejected
, 输出 Observable
会发出相应的 错误。
const source = Rx.Observable.fromPromise(fetch('http://localhost:3000'));
source.subscribe(x => console.log(x), e => console.error(e));
2
这里为了演示效果,本地起了一个服务用于测试,自测的时候可以用别的。
这样我们就能轻松拿到该请求的返回值了。
# interval
定义:
public static interval(period: number, scheduler: Scheduler): Observable
使用该操作符创建的Observable
可以在指定时间内发出连续的数字,其实就跟我们使用setInterval
这种模式差不多。在我们需要获取一段连续的数字时,或者需要定时做一些操作时都可以使用该操作符实现我们的需求。
const source = Rx.Observable.interval(1000);
source.subscribe(v => console.log(v));
2
3
默认从0开始,这里设定的时间为1s一次,它会持续不断的按照指定间隔发出数据,一般我们可以结合take
操作符进行限制发出的数据量。
# of
定义:
public static of(values: ...T, scheduler: Scheduler): Observable<T>
与from
的能力差不太多,只不过在使用的时候是传入一个一个参数来调用的,有点类似于js
中的concat
方法。同样也会返回一个Observable
,它会依次将你传入的参数合并并将数据以同步的方式发出。
const source = Rx.Observable.of(1, 2, 3);
source.subscribe(v => console.log(v));
// 1
// 2
// 3
2
3
4
5
6
依次打印1、2、3.
# repeat
定义:
public repeat(count: number): Observable
将数据源重复n
次,n
为你传入的数字类型参数。
const source = Rx.Observable.of(1, 2, 3).repeat(3);
source.subscribe(v => console.log(v));
2
这里配合of
操作符,打印结果为一次打印1、2、3、1、2、3、1、2、3,将原本只会打印一次的1、2、3转化成三次。
# range
定义:
public static range(start: number, count: number, scheduler: Scheduler): Observable
创建一个 Observable
,它发出指定范围内的数字序列。
学过
Python
的小伙伴有木有一点似曾相识的感觉。
const source = Rx.Observable.range(1, 4);
source.subscribe(v => console.log(v));
2
打印结果:1、2、3、4。
是不是倍感简单呢。