2017-05-28 93 views
1

我想測試一個可觀察對象發出的每個值,如果它符合某些標準,則將結果錯誤輸出,否則傳遞該值。這是否有運營商?如何管道可觀察對象

+0

我認爲你正在尋找的運營商是[每](http://reactivex.io/rxjs/class/es6/Observable.js~Observable .html#instance-method-every) – Maxime

+0

順便說一句,對於這類問題,請使用Gitter而不是stackoverflow – 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) 
) 

這是非常不雅。我希望有更好的方法

相關問題