Angular:如何使用 RXJS 6 调用 finally()
Posted
技术标签:
【中文标题】Angular:如何使用 RXJS 6 调用 finally()【英文标题】:Angular : how to call finally() with RXJS 6 【发布时间】:2018-12-14 00:45:25 【问题描述】:我使用的是 RXJS 5,现在升级到 6,我遇到了一些问题。
以前我可以使用 catch 和 finally,但是根据更新,catch 被替换为 catchError(在管道中)现在如何使用 finally?
我还有一些问题:
我是否需要更改 throw->throwError (在下面的代码 Observable.throw(err);)
import Observable, Subject, EMPTY, throwError from "rxjs";
import catchError from 'rxjs/operators';
return next.handle(clonedreq).pipe(
catchError((err: HttpErrorResponse) =>
if ((err.status == 400) || (err.status == 401))
this.interceptorRedirectService.getInterceptedSource().next(err.status);
return Observable.empty();
else
return Observable.throw(err);
)
//, finally(() =>
// this.globalEventsManager.showLoader.emit(false);
//);
);
还有现在如何使用 publish().refCount() ?
【问题讨论】:
【参考方案1】:用throwError
代替Observable.throw
,见https://github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/migration.md#observable-classes
finally
已重命名为 finalize
,您将在 pipe()
以及其他运算符中使用它。
与publish()
和refCount()
相同。两者都是您将在 pipe()
中使用的运算符。
【讨论】:
你能告诉我如何在“readonly notification$: Observable.pipe(publish(), refCount())
从 RxJS 6 开始,所有的操作符都是函数。在 RxJS 5 之前,运算符是 Observable
类上的方法。【参考方案2】:
需要从rxjs/operators
导入finalize
。
import finalize from 'rxjs/operators';
然后在pipe()
里面使用finalize,
observable()
.pipe(
finalize(() =>
// Your code Here
)
)
.subscribe();
【讨论】:
finalize 没有参数。【参考方案3】:According to official document,你应该像这样改变你的代码以避免编译错误:(你必须在catchError
方法中抛出异常。finalize
回调方法没有参数。)
import catchError, finalize from 'rxjs/operators';
return next.handle(clonedreq).pipe(
catchError(error =>
console.log('error occured:', error);
throw error;
),
finalize(() =>
console.log('finalize')
)
);
在Angular CLI: 7.1.4.
编译成功
【讨论】:
以上是关于Angular:如何使用 RXJS 6 调用 finally()的主要内容,如果未能解决你的问题,请参考以下文章
Angular/RxJS 6:如何防止重复的 HTTP 请求?
如何在 Angular 和 RxJs 中管理多个顺序订阅方法?
Angular 6 / Rxjs - 如何基础:observables 成功,错误,最后