finalize() 方法不会抛出未处理的异常

问题描述 投票:0回答:1

finalize() 方法似乎捕获未处理的异常并且不对它们执行任何操作。

在下面的代码中,控制台日志将运行,但在抛出错误后没有任何内容。但是您不会在开发工具或其他任何地方看到任何抛出错误的证据。这有什么原因吗?我看不到任何地方将其定义为预期功能。作为订阅的最后一个操作,我认为将此错误传递给 catchError() 没有意义。

this.obsService.getSubject().pipe(finalize(() => {
  console.log(1);
  throw new Error('Finalize issue');
  this.performFinalActions();
})).subscribe();

这是否应该直接记录为 RxJS 的问题?

rxjs
1个回答
0
投票
  1. 抛出新错误后会停止代码的执行,因此下面的代码是死代码(

    performFinalActions
    )。

  2. 我们需要从主题发出值,以便在控制台上显示错误。

  3. 最终确定发生在错误发生后,因此工作正常。

  4. finalize 代码只有在主题完成后才会发生,否则不会被调用。

下面的工作示例

import { Subject } from 'rxjs';
import { finalize, tap } from 'rxjs/operators';

function performFinalActions() {
  console.log('performing actions');
}
const subject$ = new Subject();

subject$
  .pipe(
    finalize(() => {
      console.log(1);
      throw new Error('Finalize issue');
      performFinalActions();
    })
  )
  .subscribe({
    next: (data: any) => console.log('next', data),
    error: (data: any) => console.log('error', data),
    complete: () => {
      console.log('complete');
    },
  });

subject$.next('asdf');
subject$.complete();

Stackblitz 演示

© www.soinside.com 2019 - 2024. All rights reserved.