В Angular 1.x мне иногда приходилось делать несколько http
запросов и что-то делать со всеми ответами. Я бы бросил все обещания в массив и позвонил Promise.all(promises).then(function (results) {...})
.
Лучшие практики Angular 2, похоже, указывают на использование RxJS Observable
в качестве замены обещаний в http
запросах. Если у меня есть два или более разных Observable, созданных из HTTP-запросов, есть ли эквивалент Promise.all()
?
источник
Обновление мая 2019 с использованием RxJs v6
Считал другие ответы полезными и хотел предложить пример ответа, предложенного Арно об
zip
использовании.Вот фрагмент, показывающий эквивалентность между
Promise.all
rxjs и rxjszip
(обратите внимание также, что в rxjs6 zip теперь импортируется с использованием rxjs, а не как оператора).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 тоже работает нормально, но я бы предпочел combLatest, поскольку вам не нужно беспокоиться о том, что он принимает последнее значение наблюдаемых. Таким образом, вы можете просто получать обновления всякий раз, когда какой-либо из них также генерирует новое значение (например, вы выбираете через интервал или что-то в этом роде).
источник
На reactivex.io forkJoin фактически указывает на Zip , который выполнил всю работу за меня:
let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);
источник
-_-