日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Rxjs的flatMap使用

發(fā)布時間:2025/3/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rxjs的flatMap使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Rxjs的flatMap使用

flatMap是Rxjs比較繞的一個概念,這里我們只是講解如何使用。在Rxjs 4.0版本時叫flatMap,在Rxjs 5.0時被更名為margeMap,現(xiàn)在flatMap作為margeMap的別名使用,這是考慮向下兼容。

官方flatMap的定義:
Projects each source value to an Observable which is merged in the output Observable.

mergeMap(project: function(value: T, ?index: number): ObservableInput, resultSelector: function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any, concurrent: number): Observable 名稱類型屬性描述
projectfunction(value: T, ?index: number): ObservableInput函數(shù),當(dāng)應(yīng)用于源 Observable 發(fā)出的項時,返回一個 Observable 。
resultSelectorfunction(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any可選的函數(shù),它用于產(chǎn)生基于值的輸出 Observable 和源(外部)發(fā)送和內(nèi)部 Observable 發(fā)送的索引。傳遞給這個函數(shù)參數(shù)有:
outerValue: 來自源的值
innerValue:來自投射的Observable 的值
outerIndex: 來自源的值的 “index”
innerIndex: 來自投射的 Observable 的值的 “index”
concurrentnumber可選的,默認(rèn)值: Number.POSITIVE_INFINITY可以同時訂閱的輸入 Observables 的最大數(shù)量。

返回:
Observable
該 Observable 發(fā)出由源 Observable 發(fā)出的每項應(yīng)用投射函數(shù) (和可選的 resultSelector)后的結(jié)果,并合并從該轉(zhuǎn)化獲得的 Observables 的結(jié)果。

Demo

var source = Rx.Observable.of(1,2,3).flatMap(function (x, i) {console.log(`x:${x},i:${i}`);return [x, i];},function (x, y, ix, iy) { console.log(`x:${x},y:${y},ix:${ix},iy:${iy}`);return x + y + ix + iy;}); var subscription = source.subscribe(function (x) { console.log(x);});

JSBin運(yùn)行:

"x:1,i:0" "x:1,y:1,ix:0,iy:0" 2 "x:1,y:0,ix:0,iy:1" 2 "x:2,i:1" "x:2,y:2,ix:1,iy:0" 5 "x:2,y:1,ix:1,iy:1" 5 "x:3,i:2" "x:3,y:3,ix:2,iy:0" 8 "x:3,y:2,ix:2,iy:1" 8

分享一下流程:
- flatMap將1,2,3數(shù)據(jù)流一次傳入flatMap的第一個回調(diào)函數(shù),然后輸出”x:1,i:0”
- 然后返回[1,0]數(shù)組給第二個回調(diào)函數(shù),這里的1是value,0是index,是數(shù)據(jù)的索引號
- 輸出”x:1,y:1,ix:0,iy:0”,然后返回2,這里的x參數(shù)是outerValue,y是innerValue,ix,是outerIndex,iy是innerIndex
- 在訂閱的回調(diào)函數(shù)中輸出2
- 其中的innerValue回退到上一次的值,對應(yīng)的索引增加,此時值為”x:1,y:0,ix:0,iy:1”,然后返回2
- 在訂閱的回調(diào)函數(shù)中輸出2
- 接下來flatMap接受值2,然后傳入第一個回調(diào)函數(shù)project,”x:2,i:1”,返回[2,1]
- 將[2,1]傳入第二個回調(diào)函數(shù)resultSelector,輸出”x:2,y:2,ix:1,iy:0”,返回5
- 在訂閱的回調(diào)函數(shù)中輸出5
- 然后resultSelector回調(diào)函數(shù)又一次被調(diào)用,傳入的參數(shù)(2,1,1,1),輸出”x:2,y:1,ix:1,iy:1”,并返回5
- 在訂閱的回調(diào)函數(shù)中輸出5

下面依次類推,注意的一點(diǎn)是,resultSelector函數(shù)會被調(diào)用兩次,第一次innerValue為當(dāng)前投射的值,第二次innerValue為上一次的值。

為了驗證我們的想法將flatMap的project函數(shù)返回值為[x]

var source = Rx.Observable.of(1,2,3).flatMap(function (x, i) {console.log(`x:${x},i:${i}`);return [x];},function (x, y, ix, iy) { console.log(`x:${x},y:${y},ix:${ix},iy:${iy}`);return x + y + ix + iy;}); var subscription = source.subscribe(function (x) { console.log(x);});

輸出結(jié)果:

"x:1,i:0" "x:1,y:1,ix:0,iy:0" 2 "x:2,i:1" "x:2,y:2,ix:1,iy:0" 5 "x:3,i:2" "x:3,y:3,ix:2,iy:0" 8

根據(jù)結(jié)果我們能夠發(fā)現(xiàn)resultSelector函數(shù)的執(zhí)行次數(shù)取決于project的返回值。那么我們繼續(xù)修改返回值為[x,1]

var source = Rx.Observable.of(1,2,3).flatMap(function (x, i) {console.log(`x:${x},i:${i}`);return [x,1];},function (x, y, ix, iy) { console.log(`x:${x},y:${y},ix:${ix},iy:${iy}`);return x + y + ix + iy;}); var subscription = source.subscribe(function (x) { console.log(x);});

輸出結(jié)果:

"x:1,i:0" "x:1,y:1,ix:0,iy:0" 2 "x:1,y:1,ix:0,iy:1" 3 "x:2,i:1" "x:2,y:2,ix:1,iy:0" 5 "x:2,y:1,ix:1,iy:1" 5 "x:3,i:2" "x:3,y:3,ix:2,iy:0" 8 "x:3,y:1,ix:2,iy:1" 7

結(jié)論:

根據(jù)這個結(jié)果我們能夠總結(jié)resultSelector函數(shù)的y值取決于[x,i]中的i,如果i為0,那么y的值第一次等于x,然后不發(fā)生變化。如果i為1那么y第一次等于x,然后需要回退到當(dāng)前i的值。如果i為2,那么y會從當(dāng)前的x變化到i,這期間iy的值會從0變化為1。


千萬不要高興的太早,剛剛的結(jié)論我們只是嘗試著去總結(jié),但是不幸的是錯的,沒錯,比如我們做如下修改

var source = Rx.Observable.of(1,2,3).flatMap(function (x, i) {console.log(`x:${x},i:${i}`);return [2, i];}, // 修改這里function (x, y, ix, iy) { console.log(`x:${x},y:${y},ix:${ix},iy:${iy}`);return x + y + ix + iy;}); var subscription = source.subscribe(function (x) { console.log(x);});

返回結(jié)果

"x:1,i:0" "x:1,y:2,ix:0,iy:0" 3 "x:1,y:0,ix:0,iy:1" 2 "x:2,i:1" "x:2,y:2,ix:1,iy:0" 5 "x:2,y:1,ix:1,iy:1" 5 "x:3,i:2" "x:3,y:2,ix:2,iy:0" 7 "x:3,y:2,ix:2,iy:1" 8

這個結(jié)果說明什么呢,project返回的數(shù)組決定resultSelector回調(diào)函數(shù)中的y,而resultSelector回調(diào)函數(shù)中的x是不受影響的,取決于外界傳入的值。當(dāng)project返回的數(shù)組中[2,i],決定y的觸發(fā)次數(shù),如果有兩個數(shù)組元素就被觸發(fā)2次,有5個數(shù)組元素那么就被觸發(fā)5次。

最終結(jié)論:
resultSelector
project回調(diào)函數(shù)的返回值決定resultSelector回調(diào)函數(shù)的參數(shù)y即innerValue,同時也決定resultSelector回調(diào)函數(shù)被觸發(fā)幾次。

如果將flatMap的第二個回調(diào)函數(shù)去除

var source = Rx.Observable.of(1,2,3).flatMap(function (x, i) {console.log(`x:${x},i:${i}`);return [x, i];}); var subscription = source.subscribe(function (x) { console.log(x);});

JSBin結(jié)果

"x:1,i:0" 1 0 "x:2,i:1" 2 1 "x:3,i:2" 3 2

我們可以看到這是正常的結(jié)果,flatMap返回Observable的[x,i]數(shù)組。

總結(jié)

以上是生活随笔為你收集整理的Rxjs的flatMap使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情五月激情综合网 | 免费看国产精品 | 国产精品揄拍100视频 | 91麻豆精品国产91久久久久久久久 | 日本久久久久久久久久 | 美女福利网站 | 无套日出白浆 | 伊人黄色网 | 国产高清自拍一区 | 午夜男人天堂 | 操天天操 | 91夫妻论坛 | 男生和女生一起搞鸡 | 男人插女人视频网站 | 午夜激情福利 | 国产精品秘入口18禁麻豆免会员 | www色综合| 日韩成人在线免费视频 | 香蕉视频在线免费看 | 在线观看黄色国产 | 国产野外作爱视频播放 | av色综合| 少妇紧身牛仔裤裤啪啪 | 欧美性受xxxx黑人xyx性爽 | 国产永久视频 | 国产精选久久久 | 在线观看久| 久久一区二区视频 | 亚洲区中文字幕 | 亚洲欧美专区 | 人妻精品久久久久中文字幕 | 色亚洲视频 | 成人免费淫片aa视频免费 | 米奇影视第四色 | 亚洲麻豆一区二区三区 | 男男一级淫片免费播放 | yy1111111| 久久国产情侣 | 夜间福利在线观看 | www色中色| 亚洲成人不卡 | 七月婷婷综合 | 国产精品国产三级国产播12软件 | 自拍一级片 | 日日狠狠 | 亚洲一区色| 青青艹av| 热热热热色 | 亚洲干干干 | 色无极在线 | 日本丰满大乳奶做爰 | 妺妺窝人体色www聚色窝仙踪 | 欧美色图中文字幕 | 美女视频黄色 | 一区二区三区激情视频 | 男女日日 | 日韩123区 | 国产成人精品亚洲日本在线观看 | 警察高h荡肉呻吟男男 | 国产熟妇搡bbbb搡bbbb搡 | 亚洲熟女综合一区二区三区 | 亚洲国产一区视频 | 国产精品调教 | 国产欧美一区二区三区白浆喷水 | 日本免费a视频 | 欧日韩在线观看 | 播播开心激情网 | 亚洲影院一区 | 久草黄色| 国产ts丝袜人妖系列视频 | 碰碰97| 少妇无码一区二区三区 | 国产一区自拍视频 | 911精品国产一区二区在线 | 亚洲天堂视频网 | 国内特级毛片 | 亚洲一区二区三区网站 | 欧美做受 | 51调教丨国产调教视频 | 天天爱天天插 | 精品国产aⅴ一区二区三区四川人 | 国产欧美精品国产国产专区 | 久久亚洲AV成人无码一二三 | 蜜桃在线一区二区 | 成人性生交大片免费看中文 | 青青青草视频在线观看 | 久久久无码一区二区三区 | 亚洲av无码专区在线播放中文 | 偷拍网亚洲 | 人成在线观看 | 无罩大乳的熟妇正在播放 | 特黄特色大片免费播放器使用方法 | 国产极品粉嫩 | 久久最新网址 | 日韩免费黄色 | 国产美女毛片 | 成人av社区 | 欧美偷拍精品 | 天堂成人 |