Promise.RxJS Observables ile tüm davranış?


91

Angular 1.x'te bazen birden çok httpistekte bulunmam ve tüm yanıtlarla bir şeyler yapmam gerekir. Tüm vaatleri bir diziye atardım ve çağırırdımPromise.all(promises).then(function (results) {...}) .

Angular 2 en iyi uygulamaları, RxJS'lerin taleplerde Observableverilen vaatlerin yerine geçmesi yönündedir http. Http isteklerinden oluşturulmuş iki veya daha fazla farklı Gözlemlenebilirim varsa, bunun bir eşdeğeri var mı Promise.all()?

Yanıtlar:


80

Öykünme için daha basit alternatif Promise.all, forkJoinoperatörü kullanmaktır (tüm gözlemlenebilirleri paralel olarak başlatır ve son öğelerini birleştirir):

Biraz kapsam dışı, ancak yardımcı olması durumunda, zincirleme vaatler konusunda basit bir kullanabilirsiniz flatMap: Cf. RxJS Promise Composition (veri aktarımı)


1
2 çağrım varsa, bir dönüş sözü ve başka bir dönüş gözlemlenebilirse, kullanıcı forkjoin olabilir miyim? or promise.all ()? Ya da hiç kimse, 2 işlevin aynı türde vaatler ya da gözlemlenebilir olarak dönmesine izin vermeliyim?
Joe Sleiman

1
Lütfen yardım edin, forkJoin, parametre olarak geçirilen gözlemlenebilir değerler değer yayınlamadığında çalışmaz. Gözlemlenebilir öğelerim var ve hala forkJoin işlevini kullanmak istiyorum ama çalışmıyor
Goga Koreli

19

RxJs v6 kullanarak Mayıs 2019'u güncelleyin

Diğer cevapları yararlı buldu ve Arnaud'un şu konu hakkında sunduğu cevaba bir örnek sunmak istedim zip kullanımla .

Burada Promise.allve rxjs arasındaki eşdeğerliği gösteren bir pasaj zip(ayrıca, rxjs6'da zip'in artık bir operatör olarak değil "rxjs" kullanılarak nasıl içe aktarıldığına dikkat edin).

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);
});

Her ikisinin de çıkışı aynı. Yukarıdakileri çalıştırmak şunu verir:

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

Benim için çalıştı :)
Naveen Kumar V

12

forkJoin de iyi çalışıyor, ancak gözlemlenebilirlerin son değerini alacağından endişelenmene gerek olmadığından en son birleştirmeyi tercih ederim . Bu şekilde, herhangi biri de yeni bir değer yayınladığında (örneğin, bir aralık veya başka bir şey getirdiğinizde) güncelleme alabilirsiniz.


1
Bu mevcut ihtiyaçlarımı karşılamıyor ama kesinlikle yakında kullanacağım.
Corey Ogburn

5
Bu Promise.all () ile aynı davranışı sağlamaz, ancak Promise.any () ile benzerdir
Purrell

2 çağrım varsa, bir dönüş sözü ve başka bir dönüş gözlemlenebilirse, kullanıcı forkjoin olabilir miyim? or promise.all ()? Ya da hiç kimse, 2 işlevin aynı türde vaatler ya da gözlemlenebilir olarak dönmesine izin vermeliyim?
Joe Sleiman

1
@JoeSleiman biraz geç, ancak tarafınızı seçebilirsiniz: Observable.fromPromise () ile Observable.zip () veya Obserable.toPromise () ile Promise.all ()
Arnaud P

11

Açık reactivex.io forkJoin aslında noktaları Zip benim için bir iş yaptı:

let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);

"bu, forkJoin'in bir kereden fazla yaymayacağı ve bundan sonra tamamlanacağı anlamına gelir. Yalnızca geçirilen gözlemlenebilirlerin yaşam döngüsünün sonunda değil, aynı zamanda bunun boyunca birleşik değerleri yayınlamanız gerekiyorsa, bunun yerine combLatest veya zip'i deneyin." rxjs-dev.firebaseapp.com/api/index/function/forkKatılın
Jeffrey Nicholson Carré

3
forkJoin, tüm gözlemlenebilirlerin bitmesini beklerken, zip, tüm girdiler ilk değerlerini yayınladığında bir dizi yayar. zip birçok kez yayabilir. Http aramalarınız varsa, bu hiç fark etmez.
hgoebl

Tamam, şimdi incelik anlıyorum, şerefe. Dil bölümlerinin genişlediğini fark etmemiştim-_-
Arnaud P
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.