- RxJS官方教程(一) 概覽
- RxJS官方教程(二) Observable
- RxJS官方教程(三) Observable剖析
- RxJS官方教程(四) Observer和Subscription
- RxJS官方教程(五) Subject
- RxJS官方教程(六) 算子
Operator 算子
雖然Observable是RxJS的基礎(chǔ)店诗,但是它的好用主要在于其算子庞瘸。算子允許以聲明方式輕松組合復(fù)雜異步代碼擦囊。
什么是算子瞬场?
算子是Observable的一種方法贯被,如.map(...)
彤灶,.filter(...)
幌陕,.merge(...)
搏熄,當(dāng)調(diào)用時(shí)搬卒,它們不會(huì)改變現(xiàn)有的Observable契邀。相反微饥,它們返回一個(gè)新的 Observable,其訂閱邏輯基于第一個(gè)Observable矩肩。
算子是一個(gè)基于當(dāng)前Observable創(chuàng)建新Observable的函數(shù)。這是一個(gè)純粹的操作:前一個(gè)Observable保持不變刽酱。
算子本質(zhì)上是一個(gè)純函數(shù)棵里,它將一個(gè)Observable作為輸入殿怜,并生成另一個(gè)Observable作為輸出头谜。訂閱輸出的Observable也將訂閱輸入的Observable乔夯。在下面的示例中,我們創(chuàng)建一個(gè)自定義算子新锈,將從輸入Observable接收的每個(gè)值乘以10:
function multiplyByTen(input) {
var 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;
}
var input = Rx.Observable.from([1,2,3,4]);
var output = multiplyByTen(input);
output.subscribe(x => console.log(x));
輸出:
10
20
30
40
請(qǐng)注意,訂閱output
將導(dǎo)致input
訂閱Observable拳缠。我們稱(chēng)之為“算子訂閱鏈”窟坐。
實(shí)例算子與靜態(tài)算子
什么是實(shí)例算子哲鸳?通常在引用算子時(shí)徙菠,當(dāng)它們是Observable實(shí)例上的方法婿奔,我們稱(chēng)它是實(shí)例算子萍摊。例如记餐,如果運(yùn)算符multiplyByTen
是官方實(shí)例算子片酝,它看起來(lái)大致如下:
Rx.Observable.prototype.multiplyByTen = function multiplyByTen() {
var 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()
});
});
}
實(shí)例算子是使用
this
關(guān)鍵字來(lái)推斷什么是輸入Observable的函數(shù)雕沿。
注意input
Observable不再是函數(shù)參數(shù)审轮,它被假定為this
對(duì)象篡诽。這就是我們?nèi)绾问褂眠@樣的實(shí)例算子:
var observable = Rx.Observable.from([1, 2, 3, 4]).multiplyByTen();
observable.subscribe(x => console.log(x));
什么是靜態(tài)算子杈女?除了實(shí)例算子达椰,靜態(tài)算子是直接附加到Observable類(lèi)的函數(shù)啰劲。靜態(tài)算子在內(nèi)部不使用this
關(guān)鍵字趁尼,而是完全依賴(lài)于其參數(shù)猖辫。
靜態(tài)算子是附加到Observable類(lèi)的純函數(shù)芝囤,通常用于從頭創(chuàng)建Observable悯姊。
最常見(jiàn)的靜態(tài)算子類(lèi)型是所謂的Creation Operators悯许。它們不是將輸入Observable轉(zhuǎn)換為輸出Observable,而是簡(jiǎn)單地采用非Observable參數(shù)垃僚,如數(shù)字规辱,并創(chuàng)建一個(gè)新的Observable谆棺。
靜態(tài)創(chuàng)建算子的典型示例是interval
函數(shù)。它需要一個(gè)數(shù)字(不是Observable)作為輸入?yún)?shù)罕袋,并產(chǎn)生一個(gè)Observable作為輸出:
var observable = Rx.Observable.interval(1000 /* number of milliseconds */);
創(chuàng)建算子的另一個(gè)例子是我們?cè)谇懊娴睦又袕V泛使用的create
改淑。請(qǐng)?jiān)?a target="_blank" rel="nofollow">此處查看所有靜態(tài)創(chuàng)建算子的列表。
但是浴讯,靜態(tài)算子可能與簡(jiǎn)單創(chuàng)建的性質(zhì)不同朵夏。一些聯(lián)合算子可以是靜態(tài)的兰珍,例如merge
侍郭,combineLatest
询吴,concat
等等掠河,因?yàn)樗麄儾扇?em>多種觀測(cè)量作為輸入,不只是一個(gè)猛计,例如:
var observable1 = Rx.Observable.interval(1000);
var observable2 = Rx.Observable.interval(400);
var merged = Rx.Observable.merge(observable1, observable2);
彈珠圖
為了解釋算子的工作原理唠摹,文本描述通常是不夠的。許多算子與時(shí)間有關(guān)奉瘤,例如他們可能以不同的方式延遲勾拉,采樣煮甥,節(jié)流或去抖值。圖表通常是更好的工具藕赞。Marble Diagrams是算子工作方式的可視化表示成肘,包括輸入Observable(s),算子及其參數(shù)以及輸出Observable斧蜕。
在彈珠圖中双霍,時(shí)間流向右側(cè),圖表描述了如何在Observable執(zhí)行中發(fā)出值(“彈珠”)批销。
您可以在下面看到彈珠圖的解剖結(jié)構(gòu)洒闸。
在整個(gè)文檔站點(diǎn)中,我們廣泛使用彈珠圖來(lái)解釋算子的工作方式均芽。它們?cè)谄渌h(huán)境中也可能非常有用丘逸,例如在白板上甚至在我們的單元測(cè)試中(如ASCII圖)。
選擇一個(gè)算子
您是否需要為您的問(wèn)題找到算子掀宋?首先從下面的列表中選擇一個(gè)選項(xiàng):
- 我有一個(gè)現(xiàn)有的Observable深纲,...
- 我有一些Observables作為一個(gè)Observable組合在一起,并且......
- 我還沒(méi)有Observables劲妙,而且......
算子的類(lèi)別
存在用于不同目的的算子囤萤,它們可以被分類(lèi)為:創(chuàng)建,轉(zhuǎn)換是趴,過(guò)濾涛舍,組合,多播唆途,錯(cuò)誤處理富雅,工具等。在以下列表中肛搬,您將找到按類(lèi)別組織的所有算子没佑。
創(chuàng)建算子
ajax
bindCallback
bindNodeCallback
create
defer
empty
from
fromEvent
fromEventPattern
fromPromise
generate
interval
never
of
repeat
repeatWhen
range
throw
timer
轉(zhuǎn)換算子
buffer
bufferCount
bufferTime
bufferToggle
bufferWhen
concatMap
concatMapTo
exhaustMap
expand
groupBy
map
mapTo
mergeMap
mergeMapTo
mergeScan
pairwise
partition
pluck
scan
switchMap
switchMapTo
window
windowCount
windowTime
windowToggle
windowWhen
過(guò)濾算子
debounce
debounceTime
distinct
distinctKey
distinctUntilChanged
distinctUntilKeyChanged
elementAt
filter
first
ignoreElements
audit
auditTime
last
sample
sampleTime
single
skip
skipLast
skipUntil
skipWhile
take
takeLast
takeUntil
takeWhile
throttle
throttleTime
組合算子
combineAll
combineLatest
concat
concatAll
exhaust
forkJoin
merge
mergeAll
race
startWith
switch
withLatestFrom
zip
zipAll
廣播算子
錯(cuò)誤處理算子
通用算子
do
delay
delayWhen
dematerialize
finally
let
materialize
observeOn
subscribeOn
timeInterval
timestamp
timeout
timeoutWith
toArray
toPromise
條件和布爾算子
數(shù)學(xué)和聚合算子
官網(wǎng) http://reactivex.io/rxjs/manual/overview.html#operators