No Angular 1.x, às vezes eu precisava fazer várias http
solicitações e fazer algo com todas as respostas. Eu jogaria todas as promessas em uma série e ligaria Promise.all(promises).then(function (results) {...})
.
As melhores práticas do Angular 2 parecem apontar para o uso de RxJS Observable
como um substituto para promessas em http
solicitações. Se eu tiver dois ou mais Observáveis diferentes criados a partir de solicitações http, há um equivalente a Promise.all()
?
fonte
Atualização de maio de 2019 usando RxJs v6
Achei as outras respostas úteis e gostaria de oferecer um exemplo para a resposta de Arnaud sobre o
zip
uso.Aqui está um trecho mostrando a equivalência entre
Promise.all
e o rxjszip
(observe também, em rxjs6 como o zip agora é importado usando "rxjs" e não como um operador).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); });
A saída de ambos é a mesma. Executar o acima dá:
{ 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!' ]
fonte
forkJoin funciona bem também, mas eu prefiro combineLatest, pois você não precisa se preocupar com ele pegando o último valor dos observáveis. Desta forma, você pode apenas ser atualizado sempre que algum deles emitir um novo valor também (por exemplo, você busca em um intervalo ou algo assim).
fonte
Em reactivex.io forkJoin realmente aponta para Zip , que fez o trabalho para mim:
let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);
fonte
-_-