如何使用Angular处理RxJS中的错误
How to handle errors in RxJS using Angular
我正在做一个Angular应用程序,它显示了一个从RESTful API获取的项目列表。列表的内容取决于查询。可以通过填写输入字段、使用提交按钮或将其作为查询参数添加到URL来传递查询。
为了确保一切正常运行并防止异步问题,我使用RxJS。
现在我想知道如何处理错误,因为它们可能发生在流的中间,例如。当http请求失败时。
查询作为输入流
这是两个Observables
,它们都发送一个查询序列。
// first observable for the submit button
submitFormObservable = $scope.$createObservableFunction('search');
// second observable for when the input value changes
inputObservable = $scope.$toObservable('query')
.map(function (change) {
return change.newValue;
});
获取结果
下面的Observable
在查询被更改时触发,并从API获取结果。
var mainStream = Rx.Observable.merge([submitFormObservable, inputObservable])
.where(function (query) {
return query && query.length > 0;
})
.debounce(400)
.distinctUntilChanged()
.select(getResultsForQuery)
.switchLatest();
处理错误现在我不知道如何处理错误,当eg。getResultsForQuery
抛出错误。我想显示错误而不是结果,但要阻止Observable
处理新事件。
目前我已经通过从Observable中创建两个新的流来解决这个问题,一个处理成功时的结果,一个处理发生错误时的结果。查询无效时的响应数据包含error
属性。
// stream containing the album information from LastFm
mainStream
.filter(function (response) {
return !response.data.error;
})
.map(function (response) {
return response.data.result;
})
.subscribe(function (result) {
$scope.error = undefined;
$scope.result = result;
});
错误流
mainStream
.filter(function (response) {
return response.data.error;
})
.map(function (response) {
return response.data;
});
.subscribe(function (error) {
$scope.result = [];
$scope.error = error;
});
可能的解决方案我读过关于抛出和捕获错误,但这里的问题是流似乎在第一个错误后停止,并且不触发新的事件。
使用onErrorResumeNext
在文档中描述了忽略错误并确保流在错误发生后继续。但是我找不到正确"处理"错误并显示给最终用户的方法。
我读过关于抛出和捕获错误,但这里的问题是流似乎在第一个错误后停止,并且不触发新的事件。
使用onErrorResumeNext
在文档中描述了忽略错误并确保流在错误发生后继续。但是我找不到正确"处理"错误并显示给最终用户的方法。
在这种情况下如何处理错误有什么推荐的方法吗?是否有必要为此创建两个流,还是建议抛出异常?
重要的是用户知道哪里出错了,并且流不会在第一个错误之后停止。
捕获逻辑的问题是它有效地终止了它之前的序列,这就是为什么如果您在顶级流中使用它,它将在单个异常后停止。我建议将catch逻辑包装在flatMapLatest
中。然后你可以抓住内部流并转换数据以符合下游observers
的期望。
像这样:
var mainStream = Rx.Observable.merge([submitFormObservable, inputObservable])
.where(function (query) {
return query && query.length > 0;
})
.debounce(400)
.distinctUntilChanged()
.selectSwitch(function(input) {
return getResultsForQuery(input)
.map(function(response) {
return {result : response.data.result};
})
.catch(function(e) {
return Rx.Observable.just({error : error});
});
});
mainStream.subscribe(function(r) {
$scope.result = r.result || [];
$scope.error = r.error;
});
- Node.js v6.2.0类扩展不是函数错误
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 我如何修复包含在captcha的addthis中的错误
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- CKFinder 3为所选文件返回错误的URL
- 如何仅在RxJs中可观察到的源发出的特定错误上重试
- RxJS:在循环中处理错误.js自定义驱动程序
- 最后,在 rxjs 序列上,在第一个错误时执行
- 如何捕获请求中的错误,然后打开模态,然后在模态使用RxJS关闭时重试
- 在引用最新的rxjs时获取rxjs错误
- RXJS 中的分页数据光标以及对 subject.onDone 和错误的混淆
- 错误在RxJs中被认为是来自可观察对象的发射吗?
- 如何使用Angular处理RxJS中的错误
- RxJS 错误处理
- Rxjs吞下错误