操作符
Operator(操作符)
尽管
操作符是函数,它基于当前的
function multiplyByTen(input) {
const output = Rx.Observable.create(function subscribe(observer) {
input.subscribe({
next: (v) => observer.next(10 * v),
error: (err) => observer.error(err),
complete: () => observer.complete(),
});
});
return output;
}
const input = Rx.Observable.from([1, 2, 3, 4]);
const output = multiplyByTen(input);
output.subscribe((x) => console.log(x));
实例操作符vs. 静态操作符
通常提到操作符时,我们指的是实例操作符,它是
Rx.Observable.prototype.multiplyByTen = function multiplyByTen() {
const input = this;
return Rx.Observable.create(function subscribe(observer) {
input.subscribe({
next: (v) => observer.next(10 * v),
error: (err) => observer.error(err),
complete: () => observer.complete(),
});
});
};
注意,这里的
const observable = Rx.Observable.from([1, 2, 3, 4]).multiplyByTen();
observable.subscribe((x) => console.log(x));
除了实例操作符,还有静态操作符,它们是直接附加到
const observable = Rx.Observable.interval(1000 /* 毫秒数 */);
Marble diagrams ( 弹珠图)
要解释操作符是如何工作的,文字描述通常是不足以描述清楚的。许多操作符都是跟时间相关的,它们可能会以不同的方式延迟

在弹珠图中,时间流向右边,图描述了在
操作符案例
控制流动
// 输入 "hello world"
const input = Rx.Observable.fromEvent(document.querySelector("input"), "input");
// 过滤掉小于3个字符长度的目标值
input
.filter((event) => event.target.value.length > 2)
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "hel"
// 延迟事件
input
.delay(200)
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "h" -200ms-> "e" -200ms-> "l" ...
// 每200ms只能通过一个事件
input
.throttleTime(200)
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "h" -200ms-> "w"
// 停止输入后200ms方能通过最新的那个事件
input
.debounceTime(200)
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "o" -200ms-> "d"
// 在3次事件后停止事件流
input
.take(3)
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "hel"
// 直到其他 observable 触发事件才停止事件流
const stopStream = Rx.Observable.fromEvent(
document.querySelector("button"),
"click"
);
input
.takeUntil(stopStream)
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "hello" (点击才能看到)
产生值
// 输入 "hello world"
const input = Rx.Observable.fromEvent(document.querySelector("input"), "input");
// 传递一个新的值
input
.map((event) => event.target.value)
.subscribe((value) => console.log(value)); // "h"
// 通过提取属性传递一个新的值
input.pluck("target", "value").subscribe((value) => console.log(value)); // "h"
// 传递之前的两个值
input
.pluck("target", "value")
.pairwise()
.subscribe((value) => console.log(value)); // ["h", "he"]
// 只会通过唯一的值
input
.pluck("data")
.distinct()
.subscribe((value) => console.log(value)); // "helo wrd"
// 不会传递重复的值
input
.pluck("data")
.distinctUntilChanged()
.subscribe((value) => console.log(value)); // "helo world"