我有一个按钮,它可以在键盘输入时调用API。如果他们立即多次输入,它会调用“n”号。
如何用一个干净的通用解决方案来避免这一点,以便它可以在任何地方使用?
<button click="initiateBulkPayment()(keyup.enter)="initiateBulkPayment">
initiateBulkPayment = (orderId:any, payment_methods:any) => {
let postParams = payment_methods;
console.log('this is payment_method', payment_methods);
return this.http.post(Constants.API_ENDPOINT + '/oms/api/orders/' +
orderId + '/payments/bulk_create/', postParams, this.auth.returnHeaderHandler())
.pipe(map((data: any) => {
return data;
}),
catchError((err)=>{
return throwError(err);
}));
}
5条答案
按热度按时间w7t8yxp51#
有两种解决方案:
1.在执行呼叫时禁用此按钮
1.跳过多余呼叫
您可以使用exhaustMap跳过正在执行的请求。注意,
switchMap
和shareReplay
(在其他答案中建议)不会阻止过多的http调用。一个二个一个一个
请注意,当您按下
enter
键时,click
事件也会被触发,因此没有必要侦听"keyup"。z18hc3ub2#
我能想到的最独立的方法是使用一个指令来扩展按钮元素的功能。
其思想是,按钮可以将其单击事件Map到内部流,并忽略所有后续的单击事件,直到内部流完成。
这可以通过以下方式实现:
您可以将其用作:
现场演示可在this stackblitz中找到
5vf7fwbs3#
您可以添加一个指令,在给定的时间内禁用该按钮。
查看此live demo
0tdrvxhp4#
先做一个属性指令,也可以设置阻塞的时间。
然后在按钮上放置如下指令:
6qftjkof5#
您可以禁用/启用按钮以防止单击事件或使用shareReplay rxjs操作符
文档链接:https://www.learnrxjs.io/operators/multicasting/sharereplay.html