RXJS 5 - 当所有源发出时,从一个可观察数组中发出一个复合值
RXJS 5 - Emit a single composite value from an array of observables when all sources emit
我正在使用一个可观察对象的 pipe
方法组合多个可观察对象,我想在数组中的所有可观察对象发出时发出一个最终的复合值。
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
一起使用的可出租运算符?
你们非常亲密。你想 return 链中的 forkJoin
ed 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) => {
...
});
我正在使用一个可观察对象的 pipe
方法组合多个可观察对象,我想在数组中的所有可观察对象发出时发出一个最终的复合值。
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
一起使用的可出租运算符?
你们非常亲密。你想 return 链中的 forkJoin
ed 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) => {
...
});