首页 > 解决方案 > 有没有办法同时运行 onNext() 和 onError() 函数而不在两个回调中显式调用它?

问题描述

我一直在编写在两个回调中调用相同清理函数的代码,如下所示:

lockDownStuff();

someHttpClientCall().subscribe((result: any) => {
    handleResult(result);
    unlockStuff();
}, (error: any) => {
    unlockStuff();
});

当我真的想以更像这样的方式调用关闭全局微调器、重新启用表单字段等的函数时:

lockDownStuff();

someHttpClientCall().subscribe((result: any) => {
    handleResult(result);
    unlockStuffNoMatterWhat();
});

或者

someHttpClientCall()
  .subscribe((result: any) => {
    handleResult(result);
  })
  .finally((finally: any) => unlockStuff());

标签: angularrxjs

解决方案


假设返回的 observablesomeHttpClientCall有限的(意味着它会在某个时刻发出一个完整的事件),您可以使用以下finalize运算符来实现这一点:

import {finalize} from 'rxjs/operators';

someHttpClientCall()
  .pipe(finalize(()=> unlockStuff()))
  .subscribe(...);

如果不是这种情况,您将需要将无限转换为有限,例如通过有条件地发射它直到满足某些条件takeUntil

import {finalize, takeUntil} from 'rxjs/operators';

someHttpClientCall()
  .pipe(
     takeUntil(....),
     finalize(()=> unlockStuff())
  ).subscribe(...);

推荐阅读