我已经从事件流中创建了一个Rx.Observable
:
Rx.Observable.fromEvent(recognizeStream, 'data')
每个数据事件如下所示:
{ error: null, alternatives: [result1, result2, result3] }
我想提取
alternatives
数组内的每个值,并将它们合并到流中。我必须看什么operators?据我所知,
flatMap
和concatMap
可以完成这项工作,但我不从他们的示例中了解到这一点。有人可以解释我应该使用哪个运算符并提供一个示例吗?
最佳答案
xxxMap()
运算符家族都处理高阶Observable。这意味着它们使您可以在主要Observable内部创建Observable,并将结果值内联到主流中。因此,您可以将类型签名读取为Observable<Observable<T>> => Observable<T>
给定一个流,每个排放量x是一个可观测值,包含4个值排放量:
input: --x----------x
flatMap a-a-a-a-| b-b-b-b-|
result: --a-a-a-a----b-b-b-b-|
Typecasting xxxMap(myFnc)返回值
xxxMap()
运算符都使用Observable
,Promise
或Array
类型的结果。根据需要,将根据您输入的内容将其转换为Observable。Rx.Observable.of('')
.flatMap(() => [1,2,3,4])
.subscribe(val => console.log('array value: ' + val));
Rx.Observable.of('')
.flatMap(() => Promise.resolve(1))
.subscribe(val => console.log('promise value: ' + val));
Rx.Observable.of('')
.flatMap(() => Promise.resolve([1,2,3,4]))
.subscribe(val => console.log('promise array value: ' + val));
Rx.Observable.of('')
.flatMap(() => Rx.Observable.from([1,2,3,4]))
.subscribe(val => console.log('Observable value: ' + val));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>
在您的情况下,您可以轻松地对对象进行flatMap并返回数组:
Rx.Observable.of({ error: null, alternatives: ['result1', 'result2', 'result3'] })
.flatMap(val => val.alternatives)
.subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>
所有xxxMap运算符之间的差异
mergeMap的作用
flatMap
(更广为人知的mergeMap
)会在它们进入主流时将odt_a所有排放。merge
concatMap
concatMap将在
concat
switchMap
但是switchMap会在有新的发射可用时放弃,并放弃并切换为从新的流中发射值: