2017-05-28 27 views
1

observableが放射するすべての値をテストし、一定の条件を満たす場合は結果をエラーアウトし、そうでない場合は値を渡します。これのための演算子はありますか?Observablesをパイプする方法

+0

考える[すべての](http://reactivex.io/rxjs/class/es6/Observable.js~Observable .html#instance-method-every) – Maxime

+0

ところで、この種の質問については、stackoverflowの代わりにGitterを使用してください。 – Maxime

+0

Gitterとは何ですか?それはなぜstackoverflowよりも良いですか? –

答えて

1

throwを使用すると、条件に一致しないケースを分けることができますが、それらは直ちに終了します。

let source = Observable.of(1,2,3); 

source 
    .mergeMap(value => { 
     if (value > 1) { // condition 
      return Observable.throw(`Out Of Condition: ${value}`); 
     } 
     return Observable.of(value); 
    }) 
    .subscribe(
     value => console.log(`Next: ${value}`), 
     error => console.log(`Error: ${error}`), 
     () => console.log('completed') 
    ); 

結果:

Next: 1 
Error: Out Of Condition: 2 

またbashでstdoutstderrのような方法を考えることができます。このために、追加情報が追加されました。この場合、途中で終了しません。

const stdout = 1; 
const stderr = 2; 
let source = Observable.of(1,2,3); 

source 
    .map(value => { 
     if (value > 1) { // condition 
      return [stderr, value]; 
     } 
     return [stdout, value]; 
    }) 
    .subscribe(channel_value => { 
     let channel = channel_value[0]; 
     let value = channel_value[1]; 

     if (channel == stdout) { 
      console.log(`stdout: ${value}`); 
     } 
     else if (channel == stderr) { 
      console.log(`stderr: ${value}`); 
     } 
    }); 

結果:私はあなたが探しているオペレータがある

stdout: 1 
stderr: 2 
stderr: 3 
0

私はこれが正しい答えであれば知っているが、何私のために働いていない、これは非常に洗練されObservable.create

Observable.create((observer: Observer) => 
    sourceObservable.subscribe((val: Value) => { 
    if(condition) 
     observer.next(val); 
    else 
     observer.error(val); 
    }, observer.error, observer.complete) 
) 

ました。

関連する問題