angular - 有没有办法同时运行 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());
解决方案
假设返回的 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(...);
推荐阅读
- c# - Azure Functions 依赖注入 - 注册自定义服务
- git - git diff:显示分支名称而不是提交哈希
- c++ - 如何在 C++ 中编写 MATLAB fix(X) 函数?
- python - 如何计算类别效用
- android - 如何等待协程 Dispatch.IO 数据库查询完成以填充 RecyclerView
- javascript - ES6 在 API 请求中更改为固定值
- linux - Linux正则表达式命令
- java - 如何将 String 转换为它所代表的通用信息?
- c - 映射大文件,然后使用 cgroups 限制内存
- json - 如何将 JSON 数据分配给全局变量?