跟我學Rx編程——combineLatest簡單案例

今天講一個簡單的例子

業(yè)務邏輯

  1. 發(fā)起一個異步請求
  2. 收到請求結果的時候如果不足2秒,則等待到2秒再播放動畫
  3. 如果超過2秒,則立即播放動畫

假設有一個播放動畫的函數play(data),并且用到了異步請求結果中的數據

這是一個游戲里面常用的邏輯,就是動畫是用來填補等待時間,但不能由于異步太快結束后使得動畫過早播放。也就是說需要營造一種花時間完成的錯覺。但異步時間是不好確定的,可能異步會消耗很多時間,這時候又需要真實反映異步所花費的時間。

常規(guī)寫法

let requestDone = false
let timeoutDone = false
let requestData = null
setTimeout(function(){
  if(requestDone)play(requestData)
  else timeoutDone = true
},2000)
request('http://xxx',function(data){
  requestData = data
   if(timeoutDone )play(data)
  else requestDone = true
})

本質上,這種邏輯就是互相等待的過程,是十分常見的。

Rx寫法

我們需要創(chuàng)建一個requestOb,這個就省略了
我們還需要一個timeout 的Observable,也可以用interval代替,當然自己創(chuàng)建一個也非常簡單

const timeout = period => Observable.create(observer=>setTimeout(() => {
            observer.next(0)
            observer.complete()
        }, period))

現在就可以用combineLatest將兩個Observable進行組合

combineLatest(requestOb,timeout(2000)).subscribe(x=>play(x[0]))

如果使用interval的話:

combineLatest(requestOb,interval(2000).pipe(take(1))).subscribe(x=>play(x[0]))

任何一個Observable先到達數據都不會立即發(fā)出組合事件對象,只有雙方都到達的時候才會將一個結果數組發(fā)送出來

本次案例中的兩個Observable都只會發(fā)出一個事件就會結束,combineLatest也可以用于發(fā)出多個事件的事件流的組合,每次都會在新的事件到達的時候,將所有Observable中最新的事件組合在一起??梢哉fcombineLatest是一個非常有用的組合Observable的利器。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明AI閱讀 16,172評論 3 119
  • 注意力>時間>金錢的邏輯關系,我相信戰(zhàn)友們都已經理解。既然注意力是我們最寶貴的財富,那么關于注意力的思考是...
    張照浩閱讀 1,009評論 4 8
  • 車,終于到站了,男人站在車門前觀望著,腳步緩緩落地,心情卻不能隨著腳步落下。一陣微風吹來,帶著男人的回憶慢慢飄遠...
    小哈兒cl閱讀 623評論 0 1
  • 寒冷的冬天,小獅子沒有注意多穿衣服,生病了。 獅媽媽帶小獅子來到醫(yī)院看病。醫(yī)生說要住院幾天。 小獅子的好朋友小熊,...
    萍水相逢_7525閱讀 1,114評論 0 1
  • 夏日遐想 我從遙遠的地方趕來 來赴夏日的這場盛宴 夜空里一縷星痕 在微風起處搖曳 隨手扯一片云彩 就是一場...
    寄海閱讀 284評論 0 1

友情鏈接更多精彩內容