2017-03-09 2 views
1

Ich versuche, eine Reihe von Inhalten durch eine beobachtbare zu streamen und es stoppt nach dem ersten Fehler. Es ist einfach, dies als ein Array von Elementen zu betrachten, da es sich genauso verhält.Rxjs schließt eine Observable sofort nach Fehler statt fortfahren

  1. ich eine beobachtbare aus einem Array von Element zu schaffen
  2. jedes Element die Zuordnung zu einer URL
  3. die URL als Anforderung-promise Aufruf
  4. eine Raste() durchführen, die eine observable.empty kehrt() im Falle eines Fehlers

mit RxJS 5:

rx.Observable.from(array) 
    .map(self.createUrl) 
    .flatMap(x => { 
      var options = { 
      uri: url, 
      headers: { 
       "Content-Type": "application/json" 
      }; 
      return rx.Observable.fromPromise(request-promise(options)); 
     }) 
    .catch(() => { 
    return rx.Observable.empty();}) 
    .subscribe(x => console.log('success:', x), 
      e => console.log('error'), 
      () => console.log('complete')); 

Wenn diese Sequenz ausgeführt wird, stoppt der Code nach dem ersten Fehler. Ich vermute, dass das leere Observable in # 4 das Observable beendet, aber ich bin mir nicht sicher warum.

Mein gewünschter Prozess besteht darin, dass alle Elemente in dem Array unabhängig von Fehlern verarbeitet werden - schließlich werden alle erfolgreichen Elemente verarbeitet und nach jedem Fehler fortgesetzt.

+2

Das Verhalten ist sinnvoll. Im Fehlerfall wird das ursprüngliche Observable vervollständigt und durch ein leeres ersetzt. Ich glaube, Sie suchten nach ['onErrorResumeNext()'] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/onerrorresumenext.md). Verwenden Sie es zum Beispiel in Kombination mit 'flatMap' – slezica

+0

Ich versuchte diese Idee durch Umschließen der .from (Array) Zeile mit: rx.Observable.onErrorResumeNext (rx.Observable.from (Array)), Das tat nichts . Ich bin mir nicht sicher, wie ich es von der FlatMap auf die Anfrage wickeln würde? Oder fehlt mir etwas dazwischen? –

+0

Entschuldigung - Pebkac. Wickle das Observable * inside * die Flatmap ist das, was du sagst. Danke. Es sieht so aus, als könnte ich noch nicht antworten. –

Antwort

3

Sie müssen nur die catch() innerhalb der flatMap setzen:

rx.Observable.from(array) 
    .map(self.createUrl) 
    .flatMap(x => { 
    var options = { 
     uri: url, 
     headers: { 
     "Content-Type": "application/json" 
     } 
    }; 
    return rx.Observable 
     .fromPromise(request-promise(options)) 
     .catch(() => rx.Observable.empty()); 
    }) 
    .subscribe(x => console.log('success:', x), 
      e => console.log('error'), 
      () => console.log('complete')); 

Nun, wenn dann innerer beobachtbare sendet einen Fehler sofort gefangen würde und nicht an den Hauptstrom durch .flatMap() propagieren.