Javascript 使用lodash忽略除最后一个调用之外的所有调用进行解块

Javascript 使用lodash忽略除最后一个调用之外的所有调用进行解块,javascript,debouncing,Javascript,Debouncing,如果我有一个函数foo。它在短时间内接到许多电话 function foo(name) { console.log(`Hi ${name}, it is now: `, new Date()); } 使用lodash延迟连续函数调用(去抖动)效果良好 const debouncedFoo = _.debounce(foo, 1000 ); 但是,我的目标是,即使超时( 1000代码>代码>),也不执行整个调用组,并考虑 > < >强>要执行上次调用< /强>。 换句话说,如果我在9

如果我有一个函数
foo
。它在短时间内接到许多电话

function foo(name) {
  console.log(`Hi ${name}, it is now: `, new Date());
}
使用lodash延迟连续函数调用(去抖动)效果良好

   const debouncedFoo = _.debounce(foo, 1000 );

但是,我的目标是,即使超时(<代码> 1000代码>代码>),也不执行整个调用组,并考虑<强> > < >强>要执行<强>上次调用< /强>。 换句话说,如果我在900毫秒内调用了

debouncedFoo
5次(小于“wait param”1000毫秒),我希望
foo
只执行一次,这是最后一次(5ᵗʰ)打电话

在阅读lodash文档时,我了解到,
debounce
超载了3ʳᵈ 是选项的参数。我使用了它们,但预期的行为没有发生:

   // first attempt
  const debouncedFoo = _.debounce(foo, 1000, {leading: true} );
  // second attempt
  const debouncedFoo = _.debounce(foo, 1000, {trailing: false} );

不熟悉lodash,但您可以轻松实现该行为:

function debounce(cb, duration) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => {
      cb(...args);
    }, duration);
  };
}
功能去抖动(cb,持续时间){
无功定时器;
返回函数(){
var args=参数;
清除超时(计时器);
计时器=设置超时(函数(){
cb.apply(空,args);
},持续时间);
};
}
var call=debounce(console.log.bind(console),1000);
setTimeout(函数(){call(200);},200);
setTimeout(函数(){call(400);},400);
setTimeout(函数(){call(600);},600);
setTimeout(函数(){call(800);},800);

setTimeout(函数(){call(900);},900)就像前面提到的@AndyO一样,确保您没有在每次状态更改时重新创建取消公告的函数

我也有同样的问题,所以我用
useCallback
来解决它

import React, { useCallback } from 'React';
import { debounce } from 'lodash';

const myFunction = () => { // some logic };
const debouncedMyFunction = useCallback(debounce(myFunction, 300), []);

谢谢,我已经实现了类似的东西,但是,我想利用lodash来减轻项目中的单元测试,然后增加覆盖率。这不是你想要的吗?这已经有一段时间了,但是对于任何其他(像我一样)在这方面遇到障碍的人来说——有时可以忽略的是,在每次状态更改时意外地重新创建了取消公告的函数。光荣评论@AndyO。这在我的例子中是正确的-我在react组件中使用debounce。重新渲染正在创建多个解盎司实例。通过将函数移出组件进行修复。你这个救世主✌️