2017-04-19 4 views
1

Observableに2つの(複数の)非同期関数がラップされていて、それらをすべて一緒に実行し、エラーがあるか完了したときに必ずチェックします。ここで私は何をすべきかです:RXjs - エラーの後でもリッスンします

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); 
    } 
) 

を今ここに私の問題がある...非同期両方の機能を完全には成功し、それがdata =>{}を呼び出し、アレイ内の両方の結果を返します。

2つの機能のいずれかが失敗した場合は、一度error =>{}と呼びます。それだけです。すべてのエラーを聞きたいのですが、どうしたらいいですか?

+0

一つの方法は、エラーをスローしますが、エラーコード、ア・ラ・Node.jsの '{結果を渡すことはありませんが、 err} ' – user3743222

答えて

1

複数のストリームを結合する演算子のデフォルトの動作は、ストリームの1つがエラー通知を発行するとすぐに終了することです。これは、Rx文法ごとにエラーが最終的なものであるため、一般に、オペレータが返すストリームが熱心に失敗しなければならないと仮定しているためです。

ここでの簡単な解決策の1つは、error通知を取り除き、それをnext通知に挿入されたエラーデータ構造に置き換えることです。

だから、のようなもの:あなたのsubscribeで次に

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

Observable.forkJoin(observables).subscribe(
    arrayData => arrayData.forEach(data => data.info? { 
     console.log(data.info); 
    } : { 
     console.log(data.error); 
    }) 
) 
関連する問題