2017-05-19 6 views
0

Ich erstelle im Wesentlichen eine Transaktion. Eine Vereinfachung würde wie folgt beschrieben:Rxjs Bedingung Fehlerfluss

1) Machen Sie einen Versprechen Anruf. 2) Wenn Fehler und error.code === "ConditionalCheckFailedException", den Fehler ignorieren und den Stream ohne Änderungen fortsetzen. 3) Wenn Fehler, Stream stoppen.

Die folgenden geben mir 1 und 3. Ich möchte mit dem Strom weitermachen, wenn ich eine bestimmte Ausnahme habe. Ist das möglich? ...

Im Moment habe ich:

//... stream that works to this point 
.concatMap((item) => { 
    const insertions = Rx.Observable.fromPromise(AwsCall(item)) 
     .catch(e => { 
      if (e.code === "ConditionalCheckFailedException") { 
       return item 
      } else { 
       throw e; 
      } 
     }); 
    return insertions.map(() => item); 
}) 
.concat // ... much the same 
+0

danke - von echtem Code übersetzt und eine Variable verpaßt. –

+0

Einfügungen ist ein Versprechen, oder? aber kein regelmäßiges Versprechen, weil regelmäßige Versprechungen keine 'map' Methode haben ... was macht'insertions.map'? Wie verhält es sich mit dem Versprechen, dass "Insertionen" sind? –

+0

Ja, beim AWS-Aufruf wurde eine .promise() angehängt, wenn sie zurückgegeben wird. "Insertionen" ist ein Rx.Observable.fromPromise. –

Antwort

1

So catch will eine Funktion, die eine neue Observable liefert.

Verwenden Sie stattdessen dies:

//... stream that works to this point 
.concatMap((item) => { 
    const insertions = Rx.Observable.fromPromise(AwsCall(item)) 
    .catch(e => e.code === "ConditionalCheckFailedException" 
     ? Rx.Observable.of(item) 
     : Rx.Observable.throw(e) 
    ) 
    /* depending on what AwsCall returns this might not be necessary: */ 
    .map(_ => item) 
    return insertions; 
}) 
.concat // ... much the same 

Quelle: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-catch

Verwandte Themen