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 = this._notification.asObservable().pipe(publish());”中使用带有引用计数的发布 .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 导入语法?

Angular 6 / Rxjs - 如何基础:observables 成功,错误,最后

rxjs-websockets - 如何封装为 Angular 6/7 服务

如何使用 systemjs 在最小的 Angular 2 应用程序中加载 RxJS?