2017-05-28 94 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) 
) 

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

相关问题