¿Hay algo fácilmente disponible en JavaScript (es decir, no a través de "complementos") que me permita hacer algo como setTimeout, pero en lugar de decir en cuántos milisegundos debería suceder algo, le doy un objeto de fecha diciéndole cuándo ¿hacer algo?

setToHappen(function () {
    alert('Wake up!');
}, new Date("..."));

Y sí, sé que puedo hacer esto simplemente restando new Date() con mi objeto de fecha existente (o tal vez sea al revés) para obtener la cantidad de milisegundos, pero aún me gustaría saberlo.

10
Deniz Dogan 23 abr. 2009 a las 13:40

3 respuestas

La mejor respuesta

Tendría que encontrar la cantidad de milisegundos entre ahora y su objeto de fecha.

function setToHappen(fn, d){
    var t = d.getTime() - (new Date()).getTime();
    return setTimeout(fn, t);
}
21
Simon 23 abr. 2009 a las 09:46

Simplemente puede restar Date.now() de la fecha

const myDate = new Date('...');
setTimeout(func, myDate - Date.now());
2
Yukulélé 6 sep. 2019 a las 08:55

No, pero podrías escribir fácilmente tu propia función. Simplemente calcule la diferencia entre ahora y el momento dado en milisegundos y llame a setTimeout con eso.

Algo como esto:

 setToHappen = function(fn, date){
  var now = new Date().getTime();
  var diff = date.getTime() - now;
  return setTimeout(fn, diff);
 }

EDITAR: eliminó la multiplicación adicional por 1000, ¡gracias Chris por señalarlo!

6
Pim Jager 16 dic. 2015 a las 12:52