根据官网创建操作符, 本篇文章介绍其中一些常用操作符。
create
想到创建observable, 最基本的就是create。下面是一个基本的例子:
var source = Rx.Observable.create(function(observer){
observer.next('hello');
observer.next('i want to study rxjs');
observer.complete();
});
source.subscribe({
next: function(value){
console.log(value);
}
complete: function(){
console.log('complete');
}
error: function(error){
console.log(error);
}
});
输出:
hello
i want to study rxjs
complete
基于上面的例子, 我们试着用其他操作符进行改写吧!
of
var source = Rx.Observable.of('hello', 'i want to study rxjs');
输出:
hello
i want to study rxjs
complete
与create相比, 优点就是非常简洁。
from
上面的of传入的参数是一个一个的, 如果我们想把一个数组传入呢?可以用from来接收任何可枚举的参数。
var arr = ['hello', 'world', 123];
var source = Rx.Observable.from(arr);
输出:
hello
world
123
complete
from 还可以接收字符串,此时就是字符依次输出。有空格也会输出空字符。
var source = Rx.Observable.from('hi');
输出:
h
i
complete
from 中任何可列举的参数都可用, 还可以传入 Promise函数。
var source = Rx.Observable.from(
new Promise((resolve, reject) => {
setTimeout(() => { resolve('hello rxjs')}, 3000)
})
);
输出:
hello rxjs
complete
如果传入Promise,当正常返回时, 就会被送到next, 并立即发出完成通知, 如果有错误就会送到error。
fromEvent
rxjs还可以根据event建立Observable.
var source = Rx.Observable.fromEvent(document.body, 'click');
补充,另一个方法fromEventPattern, 这个是给类使用。这里的类指的是行为和时间相像, 同时具有注册监听和移除监听两种行为。
var pro = new Producer();
var source = Rx.Observable.fromEventPattern(
(handler) => pro.addListener(handler);
(handler) => pro.removeListener(handler);
);
pro.notify('this is from event operation.');
输出:
this is from event operation.
empty
empty像是数学上的零(0), 虽然好像什么都没做, 但却相当重要。
var source = Rx.Observable.empty();
//complete
empty会立即发送出complete的消息。可以把它想像成什么都没做, 但它至少会告诉你它没做任何事。
never
与0相反的是无穷(∞), 它就好像在无穷久之后才会结束的observable。
var source = Rx.Observable.never();
throw
顾名思义, 就是抛出错误。
var source = Rx.Observable.throw('Oops!');
//Oops!
interval
interval返回一个无限递增的序列整数。
var source = Rx.Observable.interval(1000);
//0, 1, 2, ...
timer
timer有两个形参, 第一个是初始延时,第二个之后的每一次延时。
var source = Rx.Observable.timer(3000, 1000);
//在3秒时,输出0,之后每一次间隔1秒依次递增输出。
timer
第一个参数除了可以是数值(Number)之外,也可以是日期(Date),就会等到指定的时间在发送第一个值。
另外 timer
也可以只接收一个参数。
var source = Rx.Observable.timer(1000);
此时, 等待一秒之后输出0就结束了。