有没有办法在 JavaScript 中定期调用函数?

Posted

技术标签:

【中文标题】有没有办法在 JavaScript 中定期调用函数?【英文标题】:Is there any way to call a function periodically in JavaScript? 【发布时间】:2010-11-16 12:06:09 【问题描述】:

【问题讨论】:

【参考方案1】:

setInterval()方法,重复调用一个函数或者执行一段代码sn-p,每次调用之间有固定的时间延迟。它返回一个唯一标识间隔的间隔 ID,因此您可以稍后通过调用 clearInterval() 将其删除。

var intervalId = setInterval(function() 
  alert("Interval reached every 5s")
, 5000);

// You can clear a periodic function by uncommenting:
// clearInterval(intervalId);

查看更多@setInterval() @ MDN Web Docs

【讨论】:

我投了赞成票,然后决定撤销我的赞成票(但不是反对票),因为您使用了 setInterval 的字符串参数。为了效率、安全性以及它们的闭包特性,函数几乎总是应该用于支持字符串参数。 没关系,我不介意。 setInterval() 是问题的正确答案,无论参数如何。这只是一个示例,根据定义,这两种方法都是正确的。 我同意 Jason S 的观点;它真的应该是一个功能。在您的示例中,唯一的问题是性能损失可以忽略不计,但这是一个坏习惯。 我同意你们两个,使用函数更好。我从来没有说过不是。无论哪种方式都是正确的,但是为了 cmets,我将编辑答案以包含一个函数。 值得注意的是setInterval在第一次调用给定函数之前会等待间隔时间。【参考方案2】:

老问题但是.. 我还需要一个定期任务运行器并写了TaskTimer。当您需要以不同的时间间隔运行多个任务时,这也很有用。

// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);

// Add task(s) based on tick intervals.
timer.add(
    id: 'job1',       // unique id of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (set to 0 for unlimited times)
    callback(task) 
        // code to be executed on each run
        console.log(task.id + ' task has run ' + task.currentRuns + ' times.');
    
);

// Start the timer
timer.start();

TaskTimer 在浏览器和 Node 中都可以使用。有关所有功能,请参阅 documentation。

【讨论】:

【参考方案3】:

请注意,setInterval() 通常不是定期执行的最佳解决方案 - 它真的取决于您实际定期调用的 javascript

例如。如果您使用 setInterval() 的周期为 1000 毫秒,并且在周期函数中进行 ajax 调用,有时需要 2 秒才能返回,那么您将在第一个响应返回之前进行另一个 ajax 调用。这通常是不可取的。

许多库都有周期性的方法来防止天真地使用 setInterval 的陷阱,例如 Nelson 给出的 Prototype 示例。

要使用其中包含 jQuery ajax 调用的函数实现更稳健的周期性执行,请考虑以下内容:

function myPeriodicMethod() 
  $.ajax(
    url: ..., 
    success: function(data) 
      ...
    ,
    complete: function() 
      // schedule the next request *only* when the current one is complete:
      setTimeout(myPeriodicMethod, 1000);
    
  );


// schedule the first invocation:
setTimeout(myPeriodicMethod, 1000);

另一种方法是使用 setTimeout,但在变量中跟踪经过的时间,然后动态设置每次调用的超时延迟,以尽可能接近所需的时间间隔执行函数,但速度永远不会超过您获得响应的速度。

【讨论】:

setTimeout(myPeriodicMethod, 1000);被调用 2 次。是必需的吗?我认为设置超时应该只在完整的函数中调用 是的,第二个 setTimeout() 不是必需的,您可以简单地调用 myPeriodicMethod(),它会立即执行第一个 ajax 调用...但是如果您想 安排它 i> 从第一次通话开始有延迟,你可以像我写的那样写。【参考方案4】:

原生方式确实是setInterval()/clearInterval(),但如果你已经在使用Prototype库,你可以利用PeriodicExecutor:

new PeriodicalUpdator(myEvent, seconds);

这可以防止重叠调用。来自http://www.prototypejs.org/api/periodicalExecuter:

“它可以保护你免受回调函数的多个并行执行,如果它需要比给定的时间更长的时间来执行(它维护一个内部的“运行”标志,它可以屏蔽回调函数中的异常)。这尤其是如果您使用一个以给定的时间间隔与用户交互(例如使用提示或确认呼叫),这将很有用:这将避免多个消息框都等待被操作。"

【讨论】:

【参考方案5】:

每个人都已经有了 setTimeout/setInterval 解决方案。我认为重要的是要注意您可以将函数传递给 setInterval,而不仅仅是字符串。实际上,将实际函数而不是将被“评估”给这些函数的字符串可能更“安全”。

// example 1
function test() 
  alert('called');

var interval = setInterval(test, 10000);

或者:

// example 2
var counter = 0;
var interval = setInterval(function()  alert("#"+counter++); , 5000);

【讨论】:

+1 如果您是 Crockford school of JavaScript 的学生,请避免使用各种邪恶形式的 eval。 @Patrick - 我不认为“不要在名称中使用 $(美元符号)或 \(反斜杠)”的建议与 jQuery 很多:)【参考方案6】:

是的 - 查看setInterval and setTimeout 在特定时间执行代码。 setInterval 将用于定期执行代码。

查看demo and answer here 了解使用情况

【讨论】:

【参考方案7】:
function test() 
 alert('called!');

var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop()  // call this to stop your interval.
   clearInterval(id);

【讨论】:

【参考方案8】:

由于您希望函数定期执行,请使用setInterval

【讨论】:

【参考方案9】:

你会想看看 setInterval() 和 setTimeout()。

这是decent tutorial article。

【讨论】:

以上是关于有没有办法在 JavaScript 中定期调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 javascript 调用 bigquery API 函数?

如何在 HTML JavaScript 中调用 mfc C++ 函数以及如何在 mfc C++ 中调用 JavaScript 函数? [关闭]

当 Django Admin Popup(添加、更新、删除)完成时,有没有办法调用 Javascript 函数?

定期重绘 QQuickItem

java如何调用javascript的函数

自动调用django函数[重复]