RXJS 5 - 当所有源发出时,从可观察数组中发出单个复合值

时间:2018-03-28 04:52:18

标签: rxjs rxjs5 rxjs-lettable-operators

我使用可观察的pipe方法组合多个observable,并且当数组中的所有可观察者都发出时,我想发出最终的复合值。

import { apiSvc } from '../lib/api-service'

import { of as observableOf } from 'rxjs/observable/of'
import { map } from 'rxjs/operators'

const uris = [
  '/api/items/1',
  '/api/items/2',
  '/api/items/3'
]

observableOf(uris).pipe(
  // Map uris array to an array of observables.
  map((uris) => calls.map(uri) => apiSvc.get(uri) /* returns observable*/),
  // Perform magic and emit when all calls complete.
  magic()
)
.subscribe((results) => {
  console.log(results) // [{id: 1}, {id: 2}, {id: 3}]
})

我能够使用forkJoin

来完成这项工作
import { forkJoin } from 'rxjs/observable/forkJoin'

observableOf(uris).pipe(
  // Map uris array to an array of observables.
  map((uris) => calls.map(uri) => apiSvc.get(uri)),
)
.subscribe((requests) => {
  // Emits when all request observables emit.
  forkJoin(requests).subscribe((results) => {
    console.log(results) // [{id: 1}, {id: 2}, {id: 3}]
  })
})

...但我正在寻找一种方法,可以在pipe链中完成,而无需嵌套subscribe次来电。

zip运算符类似于球场,但它似乎不适用于可观察数组。是否有一个像forkJoin一样的可运作运算符,可以与pipe一起使用?

1 个答案:

答案 0 :(得分:2)

你非常接近。您希望在链中返回forkJoin已编辑的Observable,并等到其concatMap发出(mergeMap此处也可用)。

observableOf(uris)
  .pipe(
    // Map uris array to an array of observables.
    concatMap(uris => forkJoin(uris.map(uri => apiSvc.get(uri))),
  )
  .subscribe((responses) => {
    ...
  });