No estoy del todo seguro de lo que está preguntando, pero creo que Javascript no funciona de la manera que desea, por lo que no se puede hacer. Por ejemplo, no se puede hacer que una llamada a función normal dure hasta que la operación se complete o una cierta cantidad de tiempo, lo que ocurra primero. Eso se puede implementar fuera de javascript y expuesto a través de javascript (como se hace con llamadas ajax sincrónicas), pero no se puede hacer en javascript puro con funciones regulares.
A diferencia de otros idiomas, Javascript tiene un solo hilo para que mientras se ejecuta una función nunca se ejecute un temporizador (excepto para los trabajadores de la web, pero están muy, muy limitados en lo que pueden hacer). El temporizador solo se puede ejecutar cuando la función termina de ejecutarse. Por lo tanto, ni siquiera puede compartir una variable de progreso entre una función síncrona y un temporizador, por lo que no hay forma de que un temporizador "controle" el progreso de una función.
Si su código fue completamente independiente (no accedió a ninguna de sus variables globales, no llamó a sus otras funciones y no accedió al DOM de todos modos), entonces podría ejecutarlo en una web- trabajador (disponible solo en los navegadores más nuevos) y utiliza un temporizador en el hilo principal. Cuando el código del trabajador web se completa, envía un mensaje al hilo principal con sus resultados. Cuando el hilo principal recibe ese mensaje, detiene el temporizador. Si el temporizador se dispara antes de recibir los resultados, puede matar al trabajador web. Pero, su código tendría que vivir con las restricciones de los trabajadores web.
Soemthing también se puede hacer con las operaciones asincrónicas (porque trabajan mejor con-un único subproceso dad de Javascript) así:
- iniciar una operación asíncrona como una llamada AJAX o la carga de una imagen.
- Inicie un temporizador usando
setTimeout()
para su tiempo de espera.
- Si el temporizador se dispara antes de que se complete su operación asincrónica, entonces detenga la operación asincrónica (utilizando las API para cancelarla).
- Si la operación asíncrona se completa antes de que se dispare el temporizador, cancele el temporizador con
clearTimeout()
y continúe.
Por ejemplo, aquí es cómo poner un tiempo de espera en la carga de una imagen:
function loadImage(url, maxTime, data, fnSuccess, fnFail) {
var img = new Image();
var timer = setTimeout(function() {
timer = null;
fnFail(data, url);
}, maxTime);
img.onLoad = function() {
if (timer) {
clearTimeout(timer);
fnSuccess(data, img);
}
}
img.onAbort = img.onError = function() {
clearTimeout(timer);
fnFail(data, url);
}
img.src = url;
}
[ 'window.setTimeout (function_here, number_timeout_milliseconds)'] (https://developer.mozilla.org/en/DOM/window.setTimeout) o 'window.setInterval'? –
No se puede hacer, la función no devolverá el control a nada hasta que finalice. – Esailija