Promise.all behavior with RxJS Observables?

2022-08-30 05:35:11

在Angular 1.x中,我有时需要发出多个请求,并对所有响应执行一些操作。我会将所有承诺放在一个数组中并调用 。httpPromise.all(promises).then(function (results) {...})

Angular 2 的最佳实践似乎指向使用 RxJS 作为请求中承诺的替代品。如果我有两个或多个从 http 请求创建的不同可观察量,是否有等效于 ?ObservablehttpPromise.all()


答案 1

更直接的模拟替代方法是使用运算符(它并行启动所有可观察量并连接它们的最后一个元素):Promise.allforkJoin

有点超出范围,但如果它有帮助,关于链接承诺的主题,你可以使用一个简单的:Cf. RxJS承诺组合(传递数据)flatMap


答案 2

使用 RxJs v6 更新 2019 年 5 月

发现其他答案很有用,并希望为Arnaud提供的关于用法的答案提供一个例子。zip

下面是一个片段,显示了 rxjs 和 rxjs 之间的等价关系(另请注意,在 rxjs6 中,zip 现在如何使用“rxjs”而不是运算符导入)。Promise.allzip

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!' ]