2017-04-19 2 views
1

Ich habe zwei (mehrere) asynchrone Funktionen in einem Observable gewickelt und möchte sie alle zusammen laufen und überprüfen, wann immer einer einen Fehler hat oder abgeschlossen hat. Hier ist, was ich tue:RXjs - weiter zu hören auch nach Fehler

var observables = []; 

observables.push(new Observable((observer:any) => { 
    async1(options, (error, info) => { 
     if (error) { 
      observer.error(error); 
     } else { 
      observer.next(info); 
      observer.complete(); 
     } 
    }); 
})) 

observables.push(new Observable((observer:any) => { 
    async2(options, (error, info) => { 
     if (error) { 
      observer.error(error); 
     } else { 
      observer.next(info); 
      observer.complete(); 
     } 
    }); 
})) 

Observable.forkJoin(observables).subscribe(
    data => { 
     console.log(data); 
    }, 
    error => { 
     console.log(error); 
    } 
) 

Hier ist mein Problem ... wenn beide Asynchron-Funktionen erfolgreich abgeschlossen werden, es data =>{} ruft und gibt beiden Ergebnisse in einem Array.

Wenn eine der beiden Funktionen fehlschlägt, wird es einmal error =>{} aufrufen und das war's. Ich würde gerne jeden Fehler hören, wie kann ich das tun?

+0

ein Weg ist, einen Fehler nicht, werfen aber einen Fehlercode, a la node.js '{Ergebnis passieren, irr} ' – user3743222

Antwort

1

Das Standardverhalten für Operatoren, die mehrere Streams kombinieren, besteht darin, das Programm zu beenden, sobald einer der Streams eine Fehlerbenachrichtigung ausgibt. Dies ist so, weil Fehler pro Rx-Grammatik endgültig sind, so dass im Allgemeinen angenommen wird, dass der von dem Operator zurückgegebene Strom eifrig versagen muss.

Eine einfache Lösung hier ist die Beseitigung der error Benachrichtigung und ersetzt diese mit einer Fehlerdatenstruktur eingefügt in eine next Benachrichtigung.

So etwas wie:

observables.push(new Observable((observer:any) => { 
    async1(options, (error, info) => { 
     if (error) { 
      observer.next({error}); 
     } else { 
      observer.next({info}); 
      observer.complete(); 
     } 
    }); 
})) 

Dann in Ihrem subscribe:

Observable.forkJoin(observables).subscribe(
    arrayData => arrayData.forEach(data => data.info? { 
     console.log(data.info); 
    } : { 
     console.log(data.error); 
    }) 
)