【发布时间】:2018-07-31 07:16:25
【问题描述】:
我正在使用 Angular 和 rxjs 5.x.x。对于每个 http 请求,我必须将响应记录在一个集中的位置 - 无论是成功还是失败。
我面临的问题是引用了 catch 子句。
例如:
callRemote() {
return this.http.get("http://aaa.dom")
.catch(f=>Rx.Observable.of(f))
.do(f => console.log("logging response both bad and ok..."))
}
这是一个失败的http 请求。但我必须调用do 运算符,因为我需要记录它。
但是,如果调用了 .catch,则不会调用 .do。这就是我这样做的原因:
.catch(f=>Rx.Observable.of(f))
所以我基本上是在捕捉错误并将其包装为一个新的 observable 并继续使用 .do 函数。
到目前为止一切顺利。
现在的问题是,最终,在订阅时,我想知道请求是失败还是正常。
所以基本上这就是我订阅的方式:
this._http.callRemote().subscribe(
(x => console.log('OK')),
(x => console.log('ERROR')),
(() => console.log('COMPLETE'))
);
问题是一切都被重定向到sucess 回调函数。甚至失败。我明白为什么会发生 - 这是因为我将 catch 包装为新的 Observables 失败。
问题
包装错误是否有可能转到 error 回调,而不是 success 回调?
【问题讨论】:
-
如果你想让它继续出错,你为什么不
Observable.throw它而不是把它变成一个成功的流?只需将其记录在您捕获它的位置即可。 -
@jonrsharpe 你的意思是
.catch(f=>Rx.Observable.throw (f))?如果我这样做 - 则不会调用do。 -
是的,完全正确。否则你可以例如将其包裹在某种对象中,例如
{ error, result },然后再打开它,这似乎有点尴尬。 -
捕获不应该首先吞下错误,这是肯定的。最终,您可以在捕获中记录然后重新抛出,但这对于仅记录副作用来说有点矫枉过正。最简单的选择是在 do 运算符中使用错误回调。
-
@Jota.Toledo 在do操作符中使用错误回调是什么意思?
标签: angular logging rxjs error-logging angular-httpclient