Javascript 使用Promise将值预先发送到switchMap
每次Javascript 使用Promise将值预先发送到switchMap,javascript,typescript,rxjs,reactive-programming,reactive,Javascript,Typescript,Rxjs,Reactive Programming,Reactive,每次此.selectedLanguage$发出一个新值时,我需要发出一个异步计算的值。 我提出的代码如下: public readonly languageCategories$ = this.selectedLanguage$.pipe( switchMap(x => this._matchService.getCategoriesAsync(x)), shareReplay()); 我使用了switchMap,因为如果selectedLanguage在获取类别时发生更改,则应
此.selectedLanguage$
发出一个新值时,我需要发出一个异步计算的值。
我提出的代码如下:
public readonly languageCategories$ = this.selectedLanguage$.pipe(
switchMap(x => this._matchService.getCategoriesAsync(x)),
shareReplay());
我使用了switchMap
,因为如果selectedLanguage
在获取类别时发生更改,则应放弃异步调用并启动新的调用
问题是,每次异步方法开始等待时,我都希望languageCategories
发出null
(这意味着正在计算类别,[]
会产生误导)。我怎样才能做到这一点
提前谢谢你 以下是一种方法:
languageCategories$=此.selectedLanguage$.pipe(
开关图(
x=>合并(
of(null),//立即发出'null',开始加载
此._matchService.getCategoriesAsync(x),
)
),
//shareReplay()?对此不确定
);
我评论了shareReplay
,因为我不确定它是否应该在那里,因为它还将缓存null
值(异步操作开始加载时发出)。为了避免这种情况,您可以尝试以下方法:
languageCategories$=此.selectedLanguage$.pipe(
开关图(
x=>合并(
of(null),
此._matchService.getCategoriesAsync(x),
)
),
点击(v=>v==null&&dosDeeffect()),
过滤器(v=>!!v),
shareReplay()
);
另外,请注意,您可以向shareReplay
操作符添加一些配置:shareReplay({bufferSize,windowTime,scheduler,refCount})
,其中
-应该缓存多少个值;如果超过该限制,将处理最旧的存储值bufferSize
-值应存储多长时间windowTime
-指定自定义计划程序计划程序
-如果没有活动订阅者,则应销毁refCount
(在后台使用)ReplaySubject
null
的目的是什么?您是否只是想知道何时计算新值?确切地说,null
会在计算新值时使以前的值无效,而不应该是[]
,因为它会有错误的含义,因为它会产生副作用(这是必需的),可以用作加载指示器