在Angular 1.x中,有时我需要发出多个http
请求并对所有响应进行处理。我将所有的承诺都放在一个数组中并调用Promise.all(promises).then(function (results) {...})
。
Angular 2最佳实践似乎指向使用RxJSObservable
代替http
请求中的Promise 。如果我从http请求创建了两个或多个不同的Observable,那么是否有等效于的Promise.all()
?
Answers:
模拟的更直接替代方法Promise.all
是使用forkJoin
运算符(它并行启动所有可观察对象并加入其最后一个元素):
有点超出范围,但是如果有帮助的话,关于链接承诺的主题,您可以使用简单的flatMap
Cf。RxJS Promise Composition(传递数据)
使用RxJs v6更新2019年5月
发现其他答案很有用,并希望为Arnaud提供的zip
用法示例提供一个示例。
这是显示Promise.all
与rxjs之间等效的代码段zip
(另请注意,在rxjs6中,现在如何使用“ rxjs”而不是作为运算符来导入zip)。
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!' ]
forkJoin也可以正常工作,但是我更喜欢CombineLatest,因为您不必担心它会占用Observable的最后一个值。这样,只要它们中的任何一个发出新值(例如,您获取某个时间间隔之类的东西),您就可以立即进行更新。
在reactivex.io forkJoin实际指向的邮编,这做的工作对我来说:
let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);
-_-