2017-11-17 3 views
0

Aufgaben ist: Ich habe zwei Effekte (ngrx/store), sagen wir ef1 $ und ef2 $, die Observables sind. In der Winkelkomponente möchte ich erkennen, welche ausgelöst wird. Ich habe den folgenden Code:Funktioniert Observable.race für zwei Observablen mehr als einmal?

Observable.race(ef1$, ef2$) 
    .subscribe((payload) => { 
      if (payload.type == ThreadActions.THREAD_READY_TO_BE_RENDERED) { 
      // do one thing 
      } 
      else if (payload.type == ThreadActions.THREAD_ITEM_READY_TO_BE_RENDERED) { 
      // do another thing 
      } 
     }); 

Aber es sieht so aus, dass nach dem ersten emit jeder Effekte Observable.race tot sein wird und keine Reaktion mehr auf zusätzliche aussendet, trotz der ich sicher, dass Effekt führt immer wieder .

Antwort

1

Es ist schwer zu sagen, was Sie Funktionalität gewünscht ist, aber wenn Sie möchten, die verwenden race Betreiber mehr Male müssen Sie die Kette vervollständigen, wenn es sofort ein erneutes Abonnement aussendet:

Observable.defer(() => Observable.race(ef1$, ef2$)) 
    .take(1) 
    .repeat() 
    .subscribe(...); 
+0

Vielen Dank @ Martin. Das habe ich gesucht. Aber ich mache mir Sorgen wegen der Wiederaufnahme des Abonnements. –

0

Observable.race() wird nur emittiert, was auch immer die Emission zuerst kommt.

Wenn Sie zwei beobachtbare Streams wollen und beobachten sie gleichzeitig aka Sie kümmern sich nicht, wer wird emittiert, verwenden Observable.combineLatest:

Observable.combineLatest(ef1$, ef2$) 
    .subscribe(([ef1,ef2]) => { 

     //ef1.type will be ThreadActions.THREAD_READY_TO_BE_RENDERED 
     //ef2.type will be ThreadActions.THREAD_ITEM_READY_TO_BE_RENDERED 

     //check if ef1 is truthy 
     if(ef1){ 
      //do one thing 
     } 
     if(ef2){ 
      //do another thing 
     } 
    }); 
Verwandte Themen