摘要:選擇后,僅有聯(lián)通的可觀察對(duì)象會(huì)被觀察到。從外部看,所有訂閱者僅能觀測(cè)到這個(gè)聯(lián)通了支流。,其中表示輸入流,是操作符,是最后的輸出流。截圖驗(yàn)證一下當(dāng)一個(gè)流被聯(lián)通后,其他的流腫么辦先記住結(jié)論未被選擇的流將被調(diào)用方法,也就是說(shuō),他們被終止了。
起因
在SegmentFault里發(fā)布過(guò)一篇RxJS的簡(jiǎn)明教程,很多人反饋對(duì)這個(gè)主題很是很感興趣,詳見(jiàn)RxJS簡(jiǎn)明教程。
Rx 是一種編程的思維,而不是一個(gè)特定的框架或庫(kù)。RxJS是Rx*基于Javascript語(yǔ)言棧的實(shí)現(xiàn)。
我決定,今后寫一系列“深入淺出”的文章來(lái)介紹 Rx*。我選擇RxJS作為base,所有的代碼實(shí)例都會(huì)基于RxJS,這一系列文章主要會(huì)涉及以下幾個(gè)方面:
我對(duì)Rx的理解,和使用中的感悟,不會(huì)拘泥于前端或是服務(wù)端。
對(duì)Rx*標(biāo)準(zhǔn):對(duì)象、方法(API)的闡述,這部分相當(dāng)于對(duì)API文檔的翻譯。
這個(gè)系列,堅(jiān)持原創(chuàng)和對(duì)國(guó)外優(yōu)秀材料的翻譯。當(dāng)然這是個(gè)浩大的工程,希望我可以堅(jiān)持完成。
Rx* (Observable.amb & Observable#amb)注:Object.method為對(duì)象方法,Object#method為實(shí)例方法
方法定義[Rx.Observable.amb(...args)]
作用從一系列流中,訂閱最先發(fā)射的值的可觀察對(duì)象并忽略其他的可觀察對(duì)象。
參數(shù)args (Array|arguments):方法參數(shù)為多個(gè)可觀察對(duì)象(流),或者是Promise對(duì)象,對(duì)象間存在競(jìng)爭(zhēng)關(guān)系。
返回值(Observable) :方法返回呈競(jìng)爭(zhēng)態(tài)的多個(gè)可觀察對(duì)象中,首先發(fā)射的可觀察對(duì)象。
總結(jié)簡(jiǎn)單的說(shuō),amb()像一個(gè)多路電閘,一次僅能構(gòu)建一條通路:
| | | | | | | | A B C D E F G H | | | | | | | | 開關(guān)臂 | 主線 |
函數(shù)需要做出 選擇 ,選擇的依據(jù)就是哪一個(gè)可觀察對(duì)象(流)先發(fā)射了值。選擇后,僅有“聯(lián)通”的可觀察對(duì)象會(huì)被觀察到。還是用 電路 做比喻,其中“ * ”表示電子:
* | | | | | | | * | | | | | | | A B C D E F G | | | | | | | * | | | | | | | * | | | | | | | *
可以看到,E支流的電子先到達(dá)了末端,所以E路被接通。從外部看,所有訂閱者僅能觀測(cè)到這個(gè)聯(lián)通了E支流。
Rx官方喜歡使用珠寶圖來(lái)解釋各個(gè)操作符(函數(shù))的作用,珠寶圖表示amb()。
介紹一下牛逼的 珠寶圖 :
從左到右的箭頭,代表時(shí)間軸。|代表可觀察對(duì)象(流)發(fā)出了完成信號(hào)。
軸上的每一個(gè)珠寶代表流發(fā)射的值;
下方amd那個(gè)層是處理操作符,本圖意味著所有操作符以上的流,都會(huì)經(jīng)過(guò)操作符的處理(操作符以上的流為操作符的操作數(shù));
最下方,是操作符處理后的輸出結(jié)果。
y = f(x),其中x表示輸入流,f()是操作符,y是最后的輸出流。
觀察上面的珠寶圖,1, 2, 3這條時(shí)間軸上的可觀察對(duì)象發(fā)射了值1,所以amb()選擇了它作為最終輸出的可觀察對(duì)象。接下來(lái)如果它被訂閱,訂閱者會(huì)依次收到1,2 和 3。
當(dāng)然,珠寶圖不是靜態(tài)的擺設(shè) !珠寶圖不是靜態(tài)的擺設(shè) !珠寶圖不是靜態(tài)的擺設(shè)!
我們可以拖動(dòng)上面的每一個(gè)珠寶,來(lái)改變流中可觀察對(duì)象的發(fā)射順序:
我們拖動(dòng)第一個(gè)時(shí)間軸——20, 40, 60上的可觀察對(duì)象,把20這個(gè)珠寶拖到所有的珠寶前面(讓其最先發(fā)射)。
依照amb()操作符的定義,我們可以推斷,輸出會(huì)變?yōu)?b>20, 40, 60。截圖驗(yàn)證一下:
當(dāng)一個(gè)流被聯(lián)通后,其他的流腫么辦?先記住結(jié)論:未被選擇的流將被調(diào)用dispose方法,也就是說(shuō),他們被終止了。
實(shí)例HTML
JavaScript
input1 = $("#input1"); input2 = $("#input2"); var source = Rx.Observable.amb( Rx.Observable.fromEvent(input1, "click") .map(()=>"one"), Rx.Observable.fromEvent(input2, "click") .map(()=>"two") );
上面例子中,amb()中傳入了兩個(gè)點(diǎn)擊事件流。事件流1,會(huì)在點(diǎn)擊后發(fā)射字符串one;事件流2,會(huì)在點(diǎn)擊后發(fā)射字符串two;
初始情況下,產(chǎn)生事件流1之后,事件流2不會(huì)再被輸出;反之亦然,我們可以訂閱amb()產(chǎn)生的結(jié)果流:
var subscription = source.subscribe( function (x) { console.log(x); }, function (err) { console.log("Error: " + err); }, function () { console.log("Completed"); });
具體可演示實(shí)例,可以進(jìn)入amb()操作符演示。訂閱結(jié)果會(huì)在控制臺(tái)中輸出。
當(dāng)然,你可以在充分理解了amb()的原理之后修改可演示實(shí)例,驗(yàn)證自己的掌握程度。
上文提到過(guò) Rx 是一種編程模式,幾乎各個(gè)平臺(tái)、語(yǔ)言棧都有實(shí)現(xiàn)。我們?cè)囍接懴?b>amb()更寬泛地應(yīng)用:
秒殺系統(tǒng) :秒殺是一個(gè)高并發(fā)的場(chǎng)景,出現(xiàn)“多賣”是常態(tài),“多賣”是由于秒殺商品的庫(kù)存同步問(wèn)題引起的。參與秒殺的用戶呈競(jìng)爭(zhēng)態(tài),將請(qǐng)求分組后(比如100個(gè)一組),通過(guò)amd()可以甄選出具有購(gòu)買資格的用戶:因?yàn)槊霘⒌漠a(chǎn)品邏輯是:誰(shuí)手快,誰(shuí)買到。
Observable.amb( 用戶A的拍下請(qǐng)求, 用戶B的拍下請(qǐng)求, 用戶C的拍下請(qǐng)求, ... ).subscribe(function(user) { 執(zhí)行購(gòu)買邏輯,創(chuàng)建訂單,打開支付工具 })
移動(dòng)電話:假設(shè)同一時(shí)間多個(gè)人呼叫你,你接通了最先到達(dá)的來(lái)電,這段時(shí)間內(nèi)你就只能和他(她、它)通話了,其余呼叫者將會(huì)接收到忙音(對(duì)不起,你所呼叫的用戶正在通話中,請(qǐng)稍后再撥)。
Observable.amb( A來(lái)電, B來(lái)電, C來(lái)電, ... ).subscribe(function(call) { 通話吧啦吧啦 })
劇終
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78482.html
摘要:任何程序設(shè)計(jì)語(yǔ)言在講解遞歸特性時(shí),基本都會(huì)舉漢諾塔斐波拉契數(shù)列的例子。沒(méi)錯(cuò),請(qǐng)你對(duì)比一下斐波拉契數(shù)列和定義的相似之處遞歸完成后產(chǎn)生值的過(guò)程就是的過(guò)程。 Rx*(Observable.combineLatest)方法 方法定義 Rx.Observable.combineLatest(...args, [resultSelector]) 作用 通過(guò)處理函數(shù)總是將指定的可觀察對(duì)象序列中最新發(fā)...
摘要:題外話服務(wù)可用性是指,服務(wù)提供者需要保證服務(wù)在任何時(shí)間情況下正確地提供。然后服務(wù)提供者,會(huì)將驗(yàn)證碼發(fā)送到用戶手機(jī)。 Rx* (Observable.catch)方法 方法定義 Rx.Observable.catch(...args) 作用 序列中可觀察對(duì)象因?yàn)楫惓6唤K止后,繼續(xù)訂閱序列中的其他可觀察對(duì)象。 參數(shù) args (Array | arguments): 可觀察對(duì)象序列。 返...
摘要:當(dāng)無(wú)法匹配時(shí),該對(duì)象被默認(rèn)返回。如果沒(méi)有明確指定,將返回附加了指定的對(duì)象。返回值返回值為經(jīng)過(guò)選擇后的可觀察對(duì)象。題外話鍵值對(duì),可以對(duì)值進(jìn)行命名。鍵值對(duì)是對(duì)象的組成部分,鍵名可以方便進(jìn)行查找和比較操作。 Rx* (Observable.case)方法 方法定義 [Rx.Observable.case(selector, sources, [elseSource|scheduler])] ...
摘要:接下來(lái),我們將實(shí)現(xiàn)一個(gè)真實(shí)的應(yīng)用程序,顯示幾乎實(shí)時(shí)發(fā)生的地震。得到的由表示,其中包含和的合并元素。如果不同同時(shí)傳出元素,合并序列中這些元素的順序是隨機(jī)的。是操作序列的強(qiáng)大操作符。但是的方法仍在運(yùn)行,表明取消并不會(huì)取消關(guān)聯(lián)的。 Rxjs 響應(yīng)式編程-第一章:響應(yīng)式Rxjs 響應(yīng)式編程-第二章:序列的深入研究Rxjs 響應(yīng)式編程-第三章: 構(gòu)建并發(fā)程序Rxjs 響應(yīng)式編程-第四章 構(gòu)建完整...
摘要:有哪些新變化于年月日正式發(fā)布,為開發(fā)人員帶來(lái)了一些令人興奮的增補(bǔ)和改進(jìn)。不要移除包,直到你將所有的鏈?zhǔn)讲僮餍薷臑楣艿啦僮鞣? RxJS 6有哪些新變化? RxJs 6于2018年4月24日正式發(fā)布,為開發(fā)人員帶來(lái)了一些令人興奮的增補(bǔ)和改進(jìn)。Ben Lesh, rxJS核心開發(fā)成員,強(qiáng)調(diào): RxJS 6在擁有更小API的同時(shí),帶來(lái)了更整潔的引入方式 提供一個(gè)npm包,該package可...
閱讀 2954·2021-11-23 09:51
閱讀 3475·2021-11-22 09:34
閱讀 3376·2021-10-27 14:14
閱讀 1602·2019-08-30 15:55
閱讀 3408·2019-08-30 15:54
閱讀 1131·2019-08-30 15:52
閱讀 1946·2019-08-30 12:46
閱讀 2900·2019-08-29 16:11