亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

忽略特定時間的函數調用

忽略特定時間的函數調用

慕容森 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 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號