rxjs - Observable 中的 RxJs 包装函数
问题描述
我有一个问题,你如何在 observable 中包装一个普通的同步代码。让我们看这个例子:
let isCalling = false;
function makeHttpCall(url) {
isCalling = true;
return rxJsFetch(url).pipe(tap(() => (isCalling = false)));
}
该功能的问题是,isCalling
无论是否有人订阅,都会设置标志。我不想要那个(因为它还没有调用)。为了解决这个问题,我通常会做类似的事情:
let isCalling = false;
function makeHttpCallWrapped(url) {
return of(null).pipe(
mergeMap(() => {
isCalling = true;
return rxJsFetch(url).pipe(tap(() => (isCalling = false)));
}),
);
}
这有效,isCalling
仅在订阅后设置。
该代码的问题在于它不是很优雅,对于从 RxJs 开始的人来说也不是很清楚。我对你的问题是,你如何处理它?RxJs 中是否有一些我不知道的东西可以更优雅地处理它?
解决方案
RxJS 延迟运算符
Defer 允许您在订阅时创建一个 observable。这正是您已经在做的更清洁的版本。
let isCalling = false;
function makeHttpCall(url) {
return defer(() => {
isCalling = true;
return rxJsFetch(url).pipe(tap(() => (isCalling = false)));
});
}
推荐阅读
- matlab - MATLAB:如何正确应用 ifft 以将“过滤”信号带回时域?
- javascript - 如何使用jquery从var设置百分比宽度?
- php - PHP从数组中添加子数组
- javascript - 将变量传递给把手快递中的默认布局
- neo4j - Neo4J 与本地项目的连接问题
- forecasting - 如何使用 PvLib Python 生成 8760(全年)的每小时天气数据
- python - 'FlatSym' 对象没有属性 'array'
- node.js - React useSelector 第一次返回未定义,然后一切正常
- sql - 选择具有最短日期的第一个非空行(大查询)
- python - 如何获得某些数据的“形状”,以便在 numpy/scipy 中生成类似的随机数