Javascript RxJs事件重复链
我观察到一些冷RXJ,当某个事件单击$emission时,我想刷新并再次从服务器获取数据Javascript RxJs事件重复链,javascript,angular,rxjs,Javascript,Angular,Rxjs,我观察到一些冷RXJ,当某个事件单击$emission时,我想刷新并再次从服务器获取数据 let files$ = param$.pipe( param => http.getFolder(param), folder => http.getFolderFiles(folder), REPEAT_ON(click$) takeUntil(this.destroy$) ) 我应该使用什么运算符来代替想象中的重复运算符 我可以用这段代码实现这一点 let files$
let files$ = param$.pipe(
param => http.getFolder(param),
folder => http.getFolderFiles(folder),
REPEAT_ON(click$)
takeUntil(this.destroy$)
)
我应该使用什么运算符来代替想象中的重复运算符
我可以用这段代码实现这一点
let files$ = combineLatest(param$, click$.pipe(startsWith(undefined))).pipe(
param => http.getFolder(param[0]),
folder => http.getFolderFiles(folder),
takeUntil(this.destroy$)
)
但是它闻起来很难闻,我认为CombineTest不适合我的用例。为什么不呢
click$.pipe(
switchMap(() => files$)
).subscribe(res => { /* result of the chain ran again */ })
combinelatetest
没有问题,但我认为您试图找到的是repeatWhen
运算符
const array$ = Observable.from(["arr1", "arr2", "arr3", "arr4"]).do(console.log);
const click$ = Observable.fromEvent(document, 'click');
array$
.repeatWhen(() => click$)
.subscribe();
下面是一个示例:,因为它在第一次单击之前不会获取数据。(单击应仅刷新它,而不是启动它)。您可以使用startWith()进一步扩展您的解决方案,但它似乎过于工程化了是的,但这不是这段代码的错误,这是您的设计的错误:
文件$
无法获取数据,因为您是这样编码的。不,问题是您的解决方案是必需的,而不是功能性的。最后一个是RXJS的首选。请告诉我更多关于当是功能性的而不是强制性的时如何使用repeat的信息。不管怎么说,看到这些随机的理由,我再也没有时间去无谓的争论了:很高兴你解决了你的问题,回头见!问题是CombineTest需要startWith()才能真正工作。因此,当重复变得更短时,例如链接具有无限的页面重新加载循环