api List
Rx.Observable.amb(...args)
-存在競爭關系,amb里的流只能觸發一個,並且忽略其他未處理的流。
eq:
<body> <input id="input1" type="text"> <input id="input2" type="text"> </body>
import $ from "jquery"; import Rx from "rx"; var input1 = $('#input1'); var input2 = $('#input2');
var source = Rx.Observable.amb( Rx.Observable.fromEvent(input1, 'click').map(()=>'one'), Rx.Observable.fromEvent(input2, 'click').map(()=>'two') ); var subscription = source.subscribe( function (x) { console.log(x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); } );
訂閱了某個事件以后只處理本事件。訂閱是普通訂閱。
Rx.Observable.case(selector, sources, [elseSource|scheduler]
-select是一個篩選函數返回一個字符串,將字符串與sources對象的鍵值相匹配,發射匹配到的流。后面可選的是未匹配到的情況,默認是Rx.Observable.empty()
eq:
import Rx from "rx"; var sources = { hello: Rx.Observable.just('clx'), world: Rx.Observable.just('wxq') }; var subscription = Rx.Observable.case(()=>"hello", sources, Rx.Observable.empty()) subscription.subscribe(function(x) { console.log(x) })
匹配到hello,就發射Rx.Observable.just('clx')流。
實際可用於請求后的配置,比如根據ajax配置數據庫,
var config = { "database": Observable.return("數據庫配置"), "cache": Observable.return("緩存配置"), "picCDN": Observable.return("圖片CDN配置,比如七牛") }; Observable.case(()=>'database', config, Observable.empty()) .subscribe((databaseConfig) => { // 連接數據庫 }) Observable.case(()=>'picCDN', config, Observable.empty()) .subscribe((pciCDNConfig) => { // 初始化圖片CDN })
根據不同配置項進行不同的操作。
Rx.Observable.catch(...args)
args都是一個個的觀察流,當某一個拋錯了,剩下的繼續被發射。錯誤被忽略。subscribe也不會打印。當全部都拋錯,會在subscribe的onError里打印。
eq:
import Rx from "rx"; var obs1 = Rx.Observable.throw(new Error('error')); var obs2 = Rx.Observable.return(42); var source = Rx.Observable.catch(obs1, obs2); var subscription = source.subscribe( x => console.log(`onNext: ${x}`), e => console.log(`onError: ${e}`), () => console.log('onCompleted'));
obs1拋錯以后,42被正常輸出。
項目中可以處理服務商提供服務,當第一個服務商掛掉以后用第二個,全掛掉就拋錯吧。
Rx.Observable.combineLatest(...args, [resultSelector])
-當兩個Observables中的任何一個發射了數據時,使用一個函數結合每個Observable發射的最近數據項,並且基於這個函數的結果發射數據。
-仔細理解這句話,合並最近發射。
eq:
import Rx from "rx"; var colors = ["紫色","黃色","藍色","黑色"]; var shapes = ["小星星","圓形","三角形","正方形","心形","五邊形"]; var source1 = Rx.Observable.interval(3000).map(()=>colors.pop()); var source2 = Rx.Observable.interval(2000).map(()=>shapes.pop()); var combined = Rx.Observable.combineLatest(source1, source2, function(x, y){ return x + "的" + y; }).take(12); combined.subscribe((shaped)=>console.log(shaped));
2s時發射五邊形,x=五邊形,1s后發射黑色,打印,1s后又發射心形,這時x還是黑色,打印黑色的心形。……
暈。
