W Angular 1.x czasami musiałem składać wiele http
żądań i robić coś ze wszystkimi odpowiedziami. Wrzuciłbym wszystkie obietnice do tablicy i zadzwonił Promise.all(promises).then(function (results) {...})
.
Najlepsze praktyki Angular 2 wydają się wskazywać na użycie RxJS Observable
jako zamiennika obietnic w http
żądaniach. Jeśli mam dwa lub więcej różnych Observables utworzonych na podstawie żądań http, czy istnieje odpowiednik Promise.all()
?
źródło
Zaktualizuj maj 2019 przy użyciu RxJs v6
Inne odpowiedzi okazały się przydatne i chciałem podać przykład odpowiedzi udzielonej przez Arnaud na temat
zip
użycia.Oto fragment pokazujący równoważność między
Promise.all
rxjs a rxjszip
(zwróć także uwagę, w rxjs6, w jaki sposób zip jest teraz importowany przy użyciu "rxjs", a nie jako operatora).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); });
Dane wyjściowe z obu są takie same. Uruchomienie powyższego daje:
{ 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!' ]
źródło
forkJoin też działa dobrze, ale wolałbym kombajn najnowszy, ponieważ nie musisz się tym martwić, biorąc ostatnią wartość obserwabli. W ten sposób możesz być po prostu aktualizowany za każdym razem, gdy którykolwiek z nich również emituje nową wartość (np. Pobierasz w interwale lub coś takiego).
źródło
Na widelcu reactivex.ioJoin wskazuje na Zip , który wykonał zadanie za mnie:
let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);
źródło
-_-