RxJs在可观测空间中的包裹函数

RxJs在可观测空间中的包裹函数,rxjs,Rxjs,我有一个问题,如何在observable中包装一个普通的同步代码。让我们举一个例子: let isCalling=false; 函数makeHttpCall(url){ isCalling=true; 返回rxJsFetch(url).pipe(点击(()=>(isCalling=false)); } 该函数的问题是无论是否有人订阅,都会设置isCalling标志。我不想那样(因为它还没打电话)。为了解决这个问题,我通常会做以下事情: let isCalling=false; 函数makeHt

我有一个问题,如何在observable中包装一个普通的同步代码。让我们举一个例子:

let isCalling=false;
函数makeHttpCall(url){
isCalling=true;
返回rxJsFetch(url).pipe(点击(()=>(isCalling=false));
}
该函数的问题是无论是否有人订阅,都会设置
isCalling
标志。我不想那样(因为它还没打电话)。为了解决这个问题,我通常会做以下事情:

let isCalling=false;
函数makeHttpCallWrapped(url){
返回(空)。管道(
合并映射(()=>{
isCalling=true;
返回rxJsFetch(url).pipe(点击(()=>(isCalling=false));
}),
);
}
这是有效的,
isCalling
仅在订阅之后设置



该代码的问题在于它不是很优雅,对于从RxJs开始的人来说也不清楚。我想问你的是,你是如何处理的?RxJs中是否有一些我不知道的东西可以更优雅地处理它?

为了让它更优雅,我从Function创建了一个helper方法

从'rxjs'导入{of};
从“rxjs/operators”导入{mergeMap};
从'rxjs/src/internal/types'导入{SubscribableOrPromise};
从函数导出函数(函数:()=>SubscribableOrPromise){
返回(未定义).pipe(mergeMap(func));
}
然后像这样使用它:

let isCalling=false;
函数makeHttpCallWrapped(url){
从函数返回(()=>{
isCalling=true;
返回rxJsFetch(url).pipe(点击(()=>(isCalling=false));
});
}
我有点觉得
from
也应该接受这样的输入。

RxJS延迟操作符 “延迟”允许您在订阅时创建可观察的。这正是你正在做的事情的一个更干净的版本

let isCalling=false;
函数makeHttpCall(url){
返回延迟(()=>{
isCalling=true;
返回rxJsFetch(url).pipe(点击(()=>(isCalling=false));
});
}