Di Angular 1.x saya terkadang perlu membuat beberapa http
permintaan dan melakukan sesuatu dengan semua tanggapan. Saya akan membuang semua janji dalam array dan panggilanPromise.all(promises).then(function (results) {...})
.
Praktik terbaik Angular 2 tampaknya mengarah ke penggunaan RxJS Observable
sebagai pengganti promise dalam http
permintaan. Jika saya memiliki dua atau lebih Observable berbeda yang dibuat dari permintaan http, apakah ada yang setara dengan Promise.all()
?
sumber
Perbarui Mei 2019 menggunakan RxJs v6
Menemukan jawaban lain yang berguna, dan ingin menawarkan contoh untuk jawaban yang ditawarkan oleh Arnaud tentang
zip
penggunaan.Berikut ini cuplikan yang menunjukkan kesetaraan antara
Promise.all
dan rxjszip
(perhatikan juga, di rxjs6 bagaimana zip sekarang diimpor menggunakan "rxjs" & bukan sebagai operator).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); });
Output dari keduanya sama. Menjalankan di atas memberikan:
{ 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!' ]
sumber
forkJoin juga berfungsi dengan baik, tetapi saya lebih suka menggabungkanLatest karena Anda tidak perlu khawatir tentang itu mengambil nilai terakhir yang dapat diamati. Dengan cara ini, Anda bisa mendapatkan pembaruan setiap kali salah satu dari mereka memancarkan nilai baru juga (misalnya Anda mengambil pada interval atau sesuatu).
sumber
Di reactivex.io forkJoin sebenarnya menunjuk ke Zip , yang melakukan pekerjaan itu untuk saya:
let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);
sumber
-_-