我已经从事件流中创建了一个Rx.Observable:

Rx.Observable.fromEvent(recognizeStream, 'data')

每个数据事件如下所示:
{ error: null, alternatives: [result1, result2, result3] }

我想提取alternatives数组内的每个值,并将它们合并到流中。我必须看什么operators

据我所知,flatMapconcatMap可以完成这项工作,但我不从他们的示例中了解到这一点。

有人可以解释我应该使用哪个运算符并提供一个示例吗?

最佳答案

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()运算符都使用ObservablePromiseArray类型的结果。根据需要,将根据您输入的内容将其转换为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将在rxjs - Rxjs-如何提取数组中的多个值并将它们同步反馈到可观察的流-LMLPHP下一个流之前等待所有发射完成:

concat

switchMap

但是switchMap会在有新的发射可用时放弃,并放弃并切换为从新的流中发射值:

rxjs - Rxjs-如何提取数组中的多个值并将它们同步反馈到可观察的流-LMLPHP

09-30 14:52
查看更多