2015-12-09 30 views
31

Gözlemlenebilir bir şekilde beklemek istiyorum, ör. hemen çözülmesi ve yürütmeyi engellemediğini bekliyor içindeGözlemlenebilir bir Rx üzerinde nasıl bekleyebilirim?

const source = Rx.Observable.create(/* ... */) 
//... 
await source; 

Saf bir girişim sonuçları

Düzenleme: benim tam amaçlanan USECASE pseudocode geçerli: Ben hâlâ farkındayız

if (condition) { 
    await observable; 
} 
// a bunch of other code 

diğer kodu başka bir ayrı işleve dönüştürün ve onu aboneye geri çağırmaya iletin, ama bundan kaçınmayı umuyordum.

+0

bir '.subscribe()' yöntem çağrısı Kalan kod (source beklemek istiyorum olan) hareket olmaz mı? – StriplingWarrior

cevap

39

Sen await bir söz geçmek zorunda. Gözlemlenebilir bir sonraki olayı bir söze dönüştür ve bunu bekle.

if (condition) { 
    await observable.first().toPromise(); 
} 

Notu düzenle: Bu cevap başlangıçta kullanılan sökünüz (1) ama (.first kullanmak değiştirildi) bir değer aracılığıyla gelmeden önce dere biterse Promise asla çözme konusunu durumları da engeller.

+2

almak yerine (1) gözlemlemek için kullanabiliyordum gözlemlenebilir.first(). ToPromise(); '? – apricity

+0

@apricity Aynı şey ortaya çıkmalıdır. – AgentME

+8

@apricity Eğer tamamlanmada bir değer olsaydı, 'first()' reddedilir ve 'take (1) 'beklemede olur. – estus

5

await için bir söz vermeniz gerekir, bu nedenle toPromise()'u kullanmak isteyeceksiniz. toPromise() ile ilgili daha fazla ayrıntı için bkz. this.

9

O önce yorumlarda belirtildiği gibi

await observable.first().toPromise(); 

, gözlemlenebilir tamamlanan boş olduğunu take(1) ve first() operatörleri arasında önemli bir fark vardır olmak zorunda.

Observable.empty().first().toPromise() genel olarak arzu edilen bir davranıştır, buna göre ele alınabilir EmptyError ile ret etmesiyle sonuçlanacaktır.

Ve Observable.empty().take(1).toPromise() arzu ... neredeyse asla söz, beklemede sonuçlanacaktır.