RxJS-在onNext中发生错误后继续发送通知

RxJS-在onNext中发生错误后继续发送通知,rxjs,reactive-programming,reactive-extensions-js,Rxjs,Reactive Programming,Reactive Extensions Js,我是Rx的新手,如果能在错误处理方面得到一些帮助,我将不胜感激。我有下面的代码,基本上是一个typeahead: var observable = Rx.Observable.fromEvent(searchField, 'keyup') .map(ev => ev.target.value) .filter(text => text.length > 2) .debounce(500 /* ms */) .distinctUntilChange

我是Rx的新手,如果能在错误处理方面得到一些帮助,我将不胜感激。我有下面的代码,基本上是一个typeahead:

var observable = Rx.Observable.fromEvent(searchField, 'keyup')
    .map(ev => ev.target.value)
    .filter(text => text.length > 2)
    .debounce(500 /* ms */)
    .distinctUntilChanged()
    .flatMapLatest(getAsyncSearchResults);

observable.subscribe(function(value) {
        console.log("onNext");
        throw "error"; // THIS TERMINATES THE OBSERVABLE
    },
    function(error) {
        console.log("Error");
    },
    function() {
        console.log("Completed");
    });

onNext函数中发生异常后,可观察对象终止。这对我来说似乎是一个不想要的行为,因为我不想把所有的onNext代码都封装在一个try-catch中。有什么方法可以让被观察者无论发生什么异常都继续发出通知吗?

这是Rx在每个平台上的行为,在观察者中捕获异常的唯一方法是。。。好。。。抓住他们

如果经常需要,可以创建自己的
subscribeSafe
方法,将回调封装在try/catch中

或者,如果可以将正在从观察者抛出的部分移动到流本身,则可以控制错误流,并(例如)重试

示例如下:

//模拟(热)键控事件
const obs1=Rx.Observable.interval(1000).publish()
obs1.connect()
函数getAsyncSearchResults(i){
返回Rx.可观察计时器(500).映射到(i)
}
obs1.switchMap(getAsyncSearchResults).do(x=>{
console.log(x)//记录所有事件
抛出新错误()
}).retry().subscribe()

您应该让您的
下一个
完成
错误
处理程序对异常安全。当订阅者出错时,源流没有合理的方法“恢复”订阅-唯一合理的做法是停止与订阅者对话

关于这一点的完整讨论,请参见我的答案——这同样适用于Rx的任何平台实现


更详细地说,请看一个很好的解释性隐喻(NeXAgent),特别是需要考虑其他用户没有在他们的代码中抛出错误>下< /代码>处理程序。

< P>你需要切换到一个新的可丢弃流,如果其中的错误会被安全地处理,并保持原始流的活力

我已经将您的代码修改为一个更简单的0-5流,以便于演示。如果数字为3,则会引发错误/异常

Rx.可观测自([0,1,2,3,4,5])
.switchMap(值=>{
//这是一次性流!
//在这里可以安全地发生错误,而不会终止原始流
返回Rx.可观测值(值)
.map(值=>{
如果(值==3){
抛出新错误('值不能为3');
}
返回值;
})
.catch(错误=>{
//如果你愿意,你可以在这里做一些有错误的有趣的事情
//下面我们只是将错误对象返回到外部流
返回(误差)的可观测接收值;
});
})
.map(值=>{
if(值instanceof Error){
//也许在这里做一些错误处理
返回`Error:${value.message}`;
}
返回值;
})
.订阅(
(x=>console.log('Success',x)),
(x=>console.log('Error',x)),
(()=>console.log('Complete'))
);

我不知道您在subscribe方法中抛出错误的目的,但这是一种非常不符合RxJS-y的方式。我会重新考虑您的模式,并将反应性错误处理纳入管道中。这应该是公认的答案。他们的关键是有一个通往另一个内在可观察物的开关图。这个答案应该包裹在紫色长袍中,戴上王冠,并用金、银和牲畜向它致敬。