在JavaScript中,如何在特定时间运行函数?

use*_*622 12 javascript time intervals

我有一个托管仪表板的网站:我可以在页面上编辑JavaScript,而且我现在每隔五秒刷新一次.

我现在想要在window.print()每天上午8点开始运行.

我怎么能这样做?

Ast*_*oCB 38

JavaScript 不是这个的工具.如果你想在每天的特定时间运行某些东西,你几乎肯定会在寻找本地运行的东西,比如.


但是,我们暂时考虑JavaScript是您唯一的选择.有几种方法可以做到这一点,但我会给你最简单的方法.

首先,您必须创建一个new Date()并设置一个检查间隔,以查看小时是否为8(上午8点).

这将检查每分钟(60000毫秒),看看它是否是8点钟:

window.setInterval(function(){ // Set interval for checking
    var date = new Date(); // Create a Date object to find out what time it is
    if(date.getHours() === 8 && date.getMinutes() === 0){ // Check the time
        // Do stuff
    }
}, 60000); // Repeat every 60000 milliseconds (1 minute)
Run Code Online (Sandbox Code Playgroud)

它不会在执行准确,因为它是检查8点(除非你开始运行在这一分钟右)每分钟一次.您可以尽可能地减少间隔,以增加检查的准确性,但这样做有点过分:它会检查每天每小时每一分钟,看是否是8点钟.

检查的强度取决于JavaScript的性质:有更好的语言和框架用于此类事情.因为JavaScript在加载时会在网页上运行,所以它并不意味着可以处理持久的扩展任务.

还要意识到这需要打开正在执行的网页.也就是说,如果页面未打开进行计数并每分钟检查一次,则无法在每天上午8点进行预定的操作.

你说你已经每五秒刷新一次页面:如果这是真的,你根本就不需要计时器.每次刷新页面时都要检查:

var date = new Date(); // Create Date object for a reference point
if(date.getHours() === 8 && date.getMinutes() === 0 && date.getSeconds() < 10){ // Check the time like above
   // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

有了这个,您还必须检查秒数,因为您每五秒钟刷新一次,因此您将获得重复的任务.


随着中说,你可能想要做像这样在OS X计划任务或撰写的Automator工作流

如果你需要更多与平台无关的东西,我会认真考虑看看PythonBash.


作为一个更新,自动化JavaScript是在OS X Yosemite中引入的,它似乎提供了一种可行的方式来使用JavaScript来做这类事情(虽然显然你没有在同一个环境中使用它; Apple只是给你一个在本地使用另一种脚本语言的界面).

如果您使用的是OS X并且真的想使用JavaScript,我认为这是可行的方法.

与上述相关的发布说明似乎是撰写本文时的唯一现有文件(约塞米特向公众发布后约2个月),但它们值得一读.您还可以查看标签以获取一些示例.

我还发现JXA Cookbook 非常有帮助.

您可能需要稍微调整一下这种方法以根据您的具体情况进行调整,但我将概述一下.

  1. 在Automator中创建一个空白的应用程序.
    • 打开Automator.app(它应该在您的Applications目录中)并创建一个新文档.
    • 从对话框中选择"应用程序". Automator新文档对话框
  2. 添加JavaScript操作.
    • 下一步是实际添加将要执行的JavaScript.为此,首先从侧边栏向工作流添加"运行JavaScript"操作. 将JS文件拖到工作流程中
  3. 写JavaScript.

    • 在继续操作之前,您必须知道自己想要做什么.根据您提供的内容,我假设您要window.print()在Safari中加载的页面上执行.你可以这样做(或者更常见的是,在Safari选项卡中执行任意JS):

      var safari = Application('Safari');
      safari.doJavaScript('window.print();', { in: safari.windows[0].currentTab });
      
      Run Code Online (Sandbox Code Playgroud)
    • 您可能需要windows根据您的设置调整您正在访问的内容.
  4. 保存应用程序.
    • 将文件保存(File -> Save+ S)为您可以找到的位置(或iCloud)中的应用程序.
  5. 安排它运行.
    • 打开日历(或iCal).
    • 创建一个新事件并为其指定一个可识别的名称; 然后,将时间设置为所需的运行时间(在这种情况下为上午8:00).
    • 将事件设置为每天重复(或每周,每月等等 - 但通常您希望它运行).
    • 将警报(或警报,具体取决于您的版本)设置为自定义.
    • 选择"打开文件",然后选择您保存的应用程序文件.
    • 选择"事件发生时"警报定时选项. 用于安排事件的GIF指令

而已!每次将该事件设置为运行时,您在应用程序文件中编写的JavaScript代码都将运行.您应该能够在Automator中返回到您的文件,并在需要时修改代码.

  • @ user3738622我担心这将是一个完全不同的问题:我不知道Perl,所以这将是一个不同的主题,有不同的答案. (3认同)

Dra*_*SAN 7

function every8am (yourcode) {
    var now = new Date(),
        start,
        wait;

    if (now.getHours() < 7) {
        start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 0, 0, 0);
    } else {
        start = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 8, 0, 0, 0);
    }

    wait = start.getTime() - now.getTime();

    if(wait <= 0) { //If missed 8am before going into the setTimeout
        console.log('Oops, missed the hour');
        every8am(yourcode); //Retry
    } else {
        setTimeout(function () { //Wait 8am
            setInterval(function () {
                yourcode();
            }, 86400000); //Every day
        },wait);
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

var yourcode = function () {
        console.log('This will print evryday at 8am');
    };
every8am(yourcode);
Run Code Online (Sandbox Code Playgroud)

基本上,获取现在的时间戳,今天上午8点的时间戳,如果及时运行,或者明天早上8点,然后设置一个24小时的间隔来每天运行代码.您可以通过在不同的时间戳设置变量start来轻松更改运行的小时数.

我不知道如何做到这一点,正如其他人指出的那样,你需要整天打开页面才能看到发生这种情况......

此外,由于您每5秒刷新一次:

function at8am (yourcode) {
    var now = new Date(),
        start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 0, 0, 0);

    if (now.getTime() >= start.getTime() - 2500 && now.getTime() < start.getTime() + 2500) {
        yourcode();
    }
}
Run Code Online (Sandbox Code Playgroud)

以与每个上午8点相同的方式运行它,它看起来是早上8点还是后面2.5秒,如果确实如此则运行.