为了账号安全,请及时绑定邮箱和手机立即绑定

忽略特定时间的函数调用

忽略特定时间的函数调用

慕容森 2022-06-05 15:47:54
我正在寻找所描述问题的最佳解决方案。场景:有一个函数getData()每秒被调用一次。如果现在调用它,我想忽略对这个函数的任何调用,比如说 5 秒。我们如何最好地在 javascript 中实现这一点。
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

保存上次通话时间并检查是否超过 5 秒:


var lastCall = 0;


function getData() {

    if (lastCall >= moment().subtract(5, 'mins').unix()) {

        return;

    }


    lastCall = moment().unix();


    /* rest of code */

}


查看完整回答
反对 回复 2022-06-05
?
jeck猫

TA贡献1909条经验 获得超7个赞

添加一个标志并在 5 秒后切换它,并在每个未被忽略的调用上:


var shouldIgnore = false;


function getData() {

    if (shouldIgnore) {

        return;

    }

    shouldIgnore = true;

    setTimeout(() => {

        shouldIgnore = false;

    }, 5000);


    /* rest of code */

}


查看完整回答
反对 回复 2022-06-05
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

有可能使用 setTimeout 你可以做到。我已经给出了一些实用程序的示例示例,以使其更简单。


油门功能:


const throttle = (fn, ms = 0) => {

  let lastRunTime;

  return function(...args) {

    const currTime = +new Date();

    if (!lastRunTime || currTime - lastRunTime > ms) {

      lastRunTime = +new Date();

      fn.apply(this, args);

    }

  };

};

如何使用它:


(async function throttleEx() {

  const logTill1Sec = throttle(log, 1 * 1000);

  logTill1Sec("deepakt_1");

  await new Promise(r => setTimeout(r, 500)); //2 sec virtual delay

  logTill1Sec("deepak_t2");

})();

输出: Mr. deepakt_1


你注意到了,即使我多次调用 logAfter5Sec。它执行最后一个。您可以编写相同的方式调用一次。


const throttle = (fn, ms = 0) => {

  let lastRunTime;

  return function(...args) {

    const currTime = +new Date();

    if (!lastRunTime || currTime - lastRunTime > ms) {

      lastRunTime = +new Date();

      fn.apply(this, args);

    }

  };

};

(async function throttleEx() {

  const logTill1Sec = throttle(log, 1 * 1000);

  logTill1Sec("deepakt_1");

  await new Promise(r => setTimeout(r, 500)); //2 sec virtual delay

  logTill1Sec("deepak_t2");

})();


const debounce = (fn, ms = 0) => {

  let timeoutId;

  return function(...args) {

    clearTimeout(timeoutId);

    timeoutId = setTimeout(() => fn.apply(this, args), ms);

  };

};


const dLog = debounce(log, 200); //ms time


dLog("deepak11");

dLog("deepak22");

dLog("deepak33");


function log(name) {

  console.log(`Mr. ${name}`);

}


(async function() {

  const logAfter5Sec = debounce(log, 1 * 1000);

  logAfter5Sec("deepak");

  await new Promise(r => setTimeout(r, 500)); //2 sec virtual delay

  logAfter5Sec("deepak2");

})();


查看完整回答
反对 回复 2022-06-05
  • 3 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号