如何管道可观察对象
答
如果您使用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 stdout
和stderr
方式。为此,增加了其他信息。在这种情况下,它不会在中间结束。
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
答
我不知道这是否是正确的答案,但什么工作对我来说,是Observable.create
Observable.create((observer: Observer) =>
sourceObservable.subscribe((val: Value) => {
if(condition)
observer.next(val);
else
observer.error(val);
}, observer.error, observer.complete)
)
这是非常不雅。我希望有更好的方法
我认为你正在寻找的运营商是[每](http://reactivex.io/rxjs/class/es6/Observable.js~Observable .html#instance-method-every) – Maxime
顺便说一句,对于这类问题,请使用Gitter而不是stackoverflow – Maxime
什么是Gitter?为什么它比stackoverflow更好? –