翼度科技»论坛 编程开发 JavaScript 查看内容

JS实现"上次操作未完成禁止新操作"逻辑特事特办方案

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
场景

相信很多人都遇到过类似的场景:
某一个按钮是用来发送请求的,并且需要一段时间来处理。但是用户往往会在处理期间有意或无意地点击多次,因此我们希望在上一次发出的请求处理完毕之前,不再发出新的请求。

1.初步解决方案:特事特办

“特事特办”的意思,就是每次遇到这样的场景,都特意写一段逻辑来处理:
  1. document.addEventListener('click', (() => {
  2.     let lock = false;
  3.     return () => {
  4.         if(lock) return;
  5.         lock = true;
  6.         console.log('clicked');
  7.         // 为了方便测试就使用延时了
  8.         setTimeout(() => {
  9.             lock = false;
  10.         }, Math.random() * 4e3)
  11.     }
  12. })());
复制代码
2. 基于约定回调的条件式回调函数

上面的写法其实也不费事,但是这种条件限制能不能像已经被面试问烂了的“节流”和“防抖”那样,用一个函数把它包裹起来就可以达成效果呢?
问题的关键其实在于:防抖和节流需要考虑的执行条件是时间,这个条件对于所有函数而言都是一个“共同的语言”,因此才双方可以做到那样的“默契”。
而要在这种场景里实现同样的效果,双方需要刻意的约定:例如被条件执行的函数额外接受一个函数,用于在合适的时机解除条件限制。
  1. function conditioned(callback:(release:Function,...args:any[]) => any){
  2.     let lock = false;
  3.       return function(...args:any[]){
  4.         if(lock) return;
  5.         lock = true;
  6.         callback.call(this, () => {
  7.               lock = false;
  8.         }, ...args);
  9.       }
  10. }
复制代码

来源:https://www.jb51.net/javascript/2845291iq.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具