RxJS运算符在完成之前不会再次向内部发出

时间:2018-08-09 19:41:30

标签: javascript rxjs

我正在寻找类似于switchMap的运算符,但我不想取消先前的内部可观测值,而是希望它等待其内部可观测值完成后再发送给它。

一个常见的用例是用户快速单击通过管道发送到HTTP请求的按钮,然后将其转发以显示,例如:

click$.pipe(switchMap(() => this.http.get("/something"))).subscribe(res => //);

这将在用户每次单击按钮时取消http请求。相反,我要忽略按钮单击,直到内部可观察到的对象完成,然后再向其发射第二次,依此类推。

此用例是否有操作员,或者是否有简单的操作员组装?谢谢!

2 个答案:

答案 0 :(得分:3)

选中exhaustMap。看来完全符合您的需求。

  

exhaustMap忽略所有新的预计的Observable   如果先前的预计Observable尚未完成。一旦那个   一个完成,它将接受并展平下一个计划   可以观察到并重复此过程。

答案 1 :(得分:0)

以下是使用exhaustMap运算符的示例。

var clicks = Rx.Observable.fromEvent(document.querySelector("button"), 'click');
var result = clicks.exhaustMap((ev) => {
  ev.target.setAttribute("disabled", true);
  
return Rx.Observable.interval(5000).take(1)
  .do(() => ev.target.removeAttribute("disabled"));
  
});
result.subscribe(x => console.log(x));

jsbin