我正在寻找类似于switchMap
的运算符,但我不想取消先前的内部可观测值,而是希望它等待其内部可观测值完成后再发送给它。
一个常见的用例是用户快速单击通过管道发送到HTTP请求的按钮,然后将其转发以显示,例如:
click$.pipe(switchMap(() => this.http.get("/something"))).subscribe(res => //);
这将在用户每次单击按钮时取消http请求。相反,我要忽略按钮单击,直到内部可观察到的对象完成,然后再向其发射第二次,依此类推。
此用例是否有操作员,或者是否有简单的操作员组装?谢谢!
答案 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));