在 catch() 中返回 empty() 时不调用 finally()
finally() is not called when returning empty() in catch()
我写了一个通用的请求方法,它应该在请求 运行 时显示加载指示器。如果发生错误(如 404),我会在 .catch
中显示消息,然后在 return Observable.empty()
中显示消息,这样下面的代码就不会崩溃(因为没有返回数据)。
最大的问题是 .finally
也不会被调用。那是一个错误吗?有解决方法吗?这是我的代码:
res = Observable
.of(true)
.do(() => this.store.dispatch(new ShowLoadingIndicatorAction()))
.switchMap(() => this.http.get(url, { headers: this.headers }))
.publishReplay(1)
.refCount()
.catch(error => {
this.messages.handleRequestError(error);
return Observable.empty();
})
.finally(() => this.store.dispatch(new HideLoadingIndicatorAction()));
// then later:
res.subscribe(doStuffWithData);
你在用什么RxJS-version?它在这个例子中工作正常:
const res$ = Rx.Observable
.of(true)
.switchMap(() => Rx.Observable.throw("Rest Error"))
.publishReplay(1)
.refCount()
.catch(error => Rx.Observable.empty())
.finally(() => console.log("Calling Finally!"));
res$.subscribe(console.info);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
我写了一个通用的请求方法,它应该在请求 运行 时显示加载指示器。如果发生错误(如 404),我会在 .catch
中显示消息,然后在 return Observable.empty()
中显示消息,这样下面的代码就不会崩溃(因为没有返回数据)。
最大的问题是 .finally
也不会被调用。那是一个错误吗?有解决方法吗?这是我的代码:
res = Observable
.of(true)
.do(() => this.store.dispatch(new ShowLoadingIndicatorAction()))
.switchMap(() => this.http.get(url, { headers: this.headers }))
.publishReplay(1)
.refCount()
.catch(error => {
this.messages.handleRequestError(error);
return Observable.empty();
})
.finally(() => this.store.dispatch(new HideLoadingIndicatorAction()));
// then later:
res.subscribe(doStuffWithData);
你在用什么RxJS-version?它在这个例子中工作正常:
const res$ = Rx.Observable
.of(true)
.switchMap(() => Rx.Observable.throw("Rest Error"))
.publishReplay(1)
.refCount()
.catch(error => Rx.Observable.empty())
.finally(() => console.log("Calling Finally!"));
res$.subscribe(console.info);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>