使用 RxJS 承诺 .all()

Promise .all() with RxJS

我正在 Angular 2 中编写一个应用程序,我想执行几个 http 请求和 运行 响应函数。

在 Angular 1 中,我会写类似 $q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);

但是 Angular 2 returns RxJS Observables 并且在大量阅读之后我仍然无法弄清楚如何获得多个 http 请求的响应。如何做到这一点?

正如@Eric Martinez 指出的那样,forkJoin。 forkJoin 并行运行所有可观察序列并收集它们的最后一个元素。

Rx.Observable.forkJoin([a,b]).subscribe(t=> {
        var firstResult = t[0];
        var secondResult = t[1];
});

我不确定你是否想要使用 forkJoin/zip, especially considering combineLatest 更容易理解并且会在每个子流事件上发出,而 forkJoin 基本上是在每个子流上采样.

这可能会在以后想要组合多项 Observable 时成为问题。

我正在学习 RxJS,我正尝试用 RxJS v5 做同样的事情

似乎我们在 v5 上不再有 forkJoin,所以我是这样工作的(使用 flatMapmergeMap,它们是别名):

const callOne = value =>
    new window.Promise(resolve =>
        setTimeout(() => resolve(value + 10), 3000)
    );

const callTwo = value =>
    new window.Promise(resolve =>
        setTimeout(() => resolve(value + 20), 1000)
    );

Rx.Observable
    .of(2)
    .do(() => console.log('querying...'))
    .mergeMap(number =>
        Rx.Observable.zip(
            Rx.Observable.fromPromise(callOne(number)),
            Rx.Observable.fromPromise(callTwo(number))
        )
    ).concatAll()
    .subscribe(createSubscriber('promises in parallel'));

merge 不行吗?您可以订阅处理程序并将处理程序附加到 onComplete 回调。

我首先构建一个可观察对象数组,然后使用静态 merge:

let obs_ary: any = [obs1, obs2, obs3];
Observable.merge(...obs_ary);