Угловое: как вызвать finally() с помощью RXJS 6

Я использовал RXJS 5, теперь, когда я обновил его до 6, у меня возникли некоторые проблемы.

Раньше я был в состоянии использовать catch и, наконец, но в соответствии с обновлением catch заменяется на catchError (с в трубе) теперь, как использовать наконец?

Также у меня есть некоторые вопросы:

Мне нужно изменить 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().

Ответ 2

Необходимо импортировать финализ из rxjs/операторов

import { finalize } from 'rxjs/operators

Затем finalize используется внутри pipe(),

observable()
    .pipe( 
         finalize(() => {
              // Your code Here
         }
     )
).subscribe()

Ответ 3

Согласно официальному документу, вы должны изменить свой код следующим образом, чтобы избежать ошибки компиляции: (Вы должны catchError исключение в методе 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.