Saltar al contenido

En JavaScript, ¿cómo puedo ejecutar una función en un momento específico?

Solución:

JavaScript es no la herramienta para esto. Si desea que algo se ejecute a una hora específica todos los días, es casi seguro que esté buscando algo que se ejecute localmente, como python o applecript.


Sin embargo, consideremos por un momento que JavaScript es su única opción. Hay algunas formas en las que puedes hacer esto, pero te daré la más simple.

Primero, tendrás que crear un new Date() y establezca un intervalo de verificación para ver si son las 8 (para las 8 a. m.).

Esto comprobará cada minuto (60000 milisegundos) para ver si son las ocho en punto:

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)

No se ejecutará en exactamente 8 en punto (a menos que empiece a ejecutar esto justo en el minuto) porque está marcando una vez por minuto. Puede disminuir el intervalo tanto como desee para aumentar la precisión de la verificación, pero esto es excesivo, ya que verificará cada minuto de cada hora de cotidiano para ver si son las 8 en punto.

La intensidad de la comprobación se debe a la naturaleza de JavaScript: existen lenguajes y marcos mucho mejores para este tipo de cosas. Debido a que JavaScript se ejecuta en las páginas web a medida que las carga, no está diseñado para manejar tareas prolongadas y duraderas.

También tenga en cuenta que esto requiere la página web en la que se está ejecutando estar abierto. Es decir, no puede programar una acción todos los días a las 8 a. M. Si la página no está abierta para realizar el conteo y la verificación. cada minuto.

Dices que ya estás actualizando la página cada cinco segundos: si eso es true, no necesitas el temporizador en absoluto. Solo verifique cada vez que actualice la página:

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

Con esto, también tienes que comprobar los segundos porque estás refrescando cada cinco segundos, por lo que obtendría tareas duplicadas.


Dicho esto, es posible que desee hacer algo como esto o escribir un flujo de trabajo de Automator para tareas programadas en OS X.

Si necesita algo más independiente de la plataforma, consideraría seriamente echar un vistazo a Python o Bash.


Como actualización, JavaScript for Automation se introdujo con OS X Yosemite, y parece ofrecer una forma viable de usar JavaScript para este tipo de cosas (aunque obviamente no lo estás usando en el mismo contexto; Apple solo te está dando una interfaz para usar otro lenguaje de scripting localmente).

Si estás en OS X y realmente quieres usar JavaScript, creo que este es el camino a seguir.

Las notas de la versión vinculadas anteriormente parecen ser la única documentación existente al momento de escribir este artículo (que es ~ 2 meses después del lanzamiento de Yosemite al público), pero vale la pena leerlas. También puede echar un vistazo a la etiqueta de automatización de javascript para ver algunos ejemplos.

También encontré el libro de cocina de JXA extremadamente servicial.

Es posible que deba modificar un poco este enfoque para adaptarse a su situación particular, pero le daré una descripción general.

  1. Cree una aplicación en blanco en Automator.
    • Abra Automator.app (debería estar en su directorio de Aplicaciones) y cree un nuevo documento.
    • En el cuadro de diálogo, elija "Aplicación".
      Cuadro de diálogo de nuevo documento de Automator
  2. Agrega una acción de JavaScript.
    • El siguiente paso es agregar el JavaScript que se ejecutará. Para hacerlo, comience agregando una acción "Ejecutar JavaScript" desde la barra lateral al flujo de trabajo.
      Arrastre el archivo JS al flujo de trabajo
  3. Escribe el JavaScript.

    • Aquí es donde tendrá que saber lo que quiere hacer antes de continuar. Por lo que ha proporcionado, supongo que desea ejecutar window.print() en una página cargada en Safari. Puede hacer eso (o, más generalmente, ejecutar JS arbitrario en una pestaña de Safari) con esto:

      var safari = Application('Safari');
      safari.doJavaScript('window.print();',  in: safari.windows[0].currentTab );
      
    • Puede que tenga que ajustar cuál de los windows estás accediendo dependiendo de tu configuración.
  4. Guarde la aplicación.
    • Ahorrar (File -> Save o +S) el archivo como una Aplicación en una ubicación que pueda encontrar (o iCloud).
  5. Prográmelo para que se ejecute.
    • Abra Calendario (o iCal).
    • Cree un nuevo evento y asígnele un nombre identificable; luego, establezca el tiempo de ejecución deseado (8:00 AM en este caso).
    • Configure el evento para que se repita diariamente (o semanalmente, mensualmente, etc., con la frecuencia que desee).
    • Configure la alerta (o alarma, según su versión) como personalizada.
    • Elija "Abrir archivo" y seleccione el archivo de aplicación que guardó.
    • Elija "En el momento del evento" para la opción de tiempo de alerta.
      Instrucciones GIF para programar el evento

¡Eso es todo! El código JavaScript que escribió en el archivo de la aplicación se ejecutará cada vez que ese evento esté configurado para ejecutarse. Debería poder volver a su archivo en Automator y modificar el código si es necesario.

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);
    

Para usarlo:

var yourcode = function () 
        console.log('This will print evryday at 8am');
    ;
every8am(yourcode);

Básicamente, obtenga la marca de tiempo de ahora, la marca de tiempo de hoy a las 8 a. M. Si se ejecuta a tiempo, o mañana a las 8 a. M., Luego establezca un intervalo de 24 horas para ejecutar el código todos los días. Puede cambiar fácilmente la hora en que se ejecutará configurando el inicio de la variable en una marca de tiempo diferente.

No sé cómo será útil hacer ese pensamiento, como otros señalaron, necesitarás tener la página abierta todo el día para que eso suceda ...

Además, dado que se actualiza cada 5 segundos:

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();
    

Ejecútelo de la misma manera que todas las 8 a. M., Mire si las 8 a. M. Están 2,5 segundos por delante o por detrás, y ejecútelo si lo hace.

Intento dar mi respuesta con la esperanza de que pueda ayudar:

    function startJobAt(hh, mm, code) 

Con startJobAt puede ejecutar solo una de las tareas que desee, pero si necesita volver a ejecutar su tarea, depende de usted recuperar startJobAt.

adiós

PD

Si necesita una operación de impresión automática, sin cuadro de diálogo, considere usar el complemento http://jsprintsetup.mozdev.org/reference.html para mozilla u otro complemento para otros bowsers.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *