保证 RxJS 观察者的所有行为?

在 Angular 1.x 中,我有时需要发出多个 http请求,并对所有的响应进行处理。我将把所有承诺放在一个数组中,然后调用 Promise.all(promises).then(function (results) {...})

Angular 2最佳实践似乎指向使用 RxJS 的 Observable来替代 http请求中的承诺。如果我有两个或更多不同的观察从 http 请求创建,是否有一个相当于 Promise.all()

77236 次浏览

The more straightforward alternative for emulating Promise.all is to use the forkJoin operator (it starts all observables in parallel and join their last elements):

有点超出了范围,但是如果有帮助的话,关于链式承诺,您可以使用一个简单的 flatMap: 参考 承诺组合(传递数据)

forkJoin 也可以很好地工作,但是我更喜欢 最新合并,因为你不需要担心它取观察值的最后一个值。这样,只要它们中的任何一个也发出一个新值,您就可以得到更新(例如,您获取一个间隔或其他东西)。

Reactivex.io 分叉加入实际上指向 什么都没有,它为我完成了工作:

let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);

使用 RxJs v6更新2019年5月

Found the other answers useful, and wished to offer an example for the answer offered by Arnaud about zip usage.

下面的代码片段显示了 Promise.all和 rxjs zip之间的等价关系(还要注意,在 rxjs6中,zip 是如何使用“ rxjs”& not 作为操作符导入的)。

import { zip } from "rxjs";


const the_weather = new Promise(resolve => {
setTimeout(() => {
resolve({ temp: 29, conditions: "Sunny with Clouds" });
}, 2000);
});


const the_tweets = new Promise(resolve => {
setTimeout(() => {
resolve(["I like cake", "BBQ is good too!"]);
}, 500);
});


// Using RxJs
let source$ = zip(the_weather, the_tweets);
source$.subscribe(([weatherInfo, tweetInfo]) =>
console.log(weatherInfo, tweetInfo)
);


// Using ES6 Promises
Promise.all([the_weather, the_tweets]).then(responses => {
const [weatherInfo, tweetInfo] = responses;
console.log(weatherInfo, tweetInfo);
});

两者的输出是相同的,运行上面的代码会得到:

{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]
{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]