javascript - 编写一个函数来检查另一个函数在一段时间内被调用的次数

标签 javascript

假设我有一个每 500 毫秒记录一次“Hello”的函数。

var logHello = function() {
  setInterval(function(){ 
    console.log("Hello"); 
  }, 500);
};

有没有办法编写另一个函数来检查 logHello 是否每秒被调用超过或等于 1 次(而不修改原始 logHello 函数)。

在这种情况下,它将返回 true,因为 Hello 将在 1 秒内被记录 2 次。

最佳答案

我假设您出于调试原因想要执行此操作,因此我必须警告您不要在任何生产应用程序中包含此代码,因为它实际上只是用于调试。我们的解决方案可以工作,这非常酷,但是它覆盖了 native JavaScript 功能,这通常会令人不悦,因为如果您更改 native 函数的行为,它可能会导致代码的行为与预期不同。

如果不允许修改代码,您可以简单地覆盖 javascript 的 setInterval,并将其用作函数中的“钩子(Hook)”。我们将修改 setInterval 以跟踪方法调用之间的时间差(秒)。然后,我们将调用并返回原始 setInterval 方法,以便您的代码仍然完全按预期工作:

// keep a pointer to the original setInterval function
var oldSetInterval = window.setInterval;

// we will create our own setInterval function and put logging in it
window.setInterval = function(block, interval) {
  var lastRunAt;
  return oldSetInterval(function() {
    // here is where we print how long it's been since the method last ran
    if(lastRunAt) {
      console.log("the interval last ran " + (Date.now()-lastRunAt)/1000 + " seconds ago");
    }
    lastRunAt = Date.now();
    block();
  }, interval);
}

现在运行 logHello() 会产生:

Hello
the interval last ran 0.504 seconds ago
Hello
the interval last ran 0.504 seconds ago
Hello
the interval last ran 0.505 seconds ago

这假设您正在网络上运行。如果您在 Node 中,请将对 window 的引用替换为 globals

关于javascript - 编写一个函数来检查另一个函数在一段时间内被调用的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793200/

相关文章:

javascript - 如何在 $.ajax( 中使用 if 语句并检查字符串响应?

javascript - Ractive JS 并使用 LaTeX 输入更新 MathJax?

javascript - 使用 localStorage 和 sessionStorage 作为元素树

javascript - 如果单击 <li>,隐藏内部 div

javascript - Leaflet Contextmenu - 如何在执行回调函数时传递标记引用(非geoJSON标记)

javascript - Initiate Masonry - 在无限滚动和参数搜索之后

javascript - Require JS 定义函数中如何处理参数

javascript - 是否可以将 Alertify.js 的取消按钮调用的操作与 onclose 分开

javascript - 将彩色框作为图例添加到莫里斯图

c# - 在 ASP.NET WebForms 中回发后滚动到上一个位置