2010-02-19 12 views
5

Pido disculpas si este es un duplicado.Mata a un proceso de Javascript después de un período de tiempo establecido

Digamos que tengo una función de JavaScript que llama a un servicio web para extraer algunos datos. Uso algún tipo de gráfico en movimiento para que el usuario sepa que está funcionando. Cuando se recupera con éxito, cambio el gráfico a una marca de verificación. Aquí está mi código:

getData: function() { 
    $("#button").attr("disabled", "true"); 

    var params = { 
     doRefresh: false, 
     method: '/GetData', 
     onSuccess: new this.getDataCallback(this).callback, 
     onFailure: new this.getDataFailed(this).callback, 
     args: { text: $("#getData").val() } 
    }; 

     WebService.invoke(params.method, params.onSuccess, params.onFailure, params.args); 

} 

Lo que me gustaría es después de 5 minutos, si este proceso todavía no ha regresado con éxito mis datos, para lanzar una excepción o, mejor aún, ejecutar mi función this.getDataFailed (este) .llamar de vuelta. ¿Esto parece factible con JavaScript? He observado setTimeout() y setInterval(), y parece que solo retrasan la ejecución de un script, mientras que quiero literalmente "agotar el tiempo" de un proceso de larga ejecución. ¿Algunas ideas?

Además, estoy abierto a cualquier crítica/mejora de mi código que permita esta funcionalidad.

Respuesta

5

IE8 ofrece una timeout propiedad y ontimeout evento. Sin embargo, estos no son estándares.

Me di cuenta de que está utilizando jQuery en algunos de sus códigos de ejemplo. jQuery también admite una propiedad timeout para su método ajax() que ejecutará la devolución de llamada error una vez que se haya alcanzado el límite de tiempo de espera. Usted puede utilizar el método $.ajaxSetup() declarar el tiempo de espera antes de hacer llamadas ajax:

$.ajaxSetup({ 
    timeout: 300000 
}); 

Si usted no está usando jQuery para hacer sus solicitudes usted puede rodar su propio código de tiempo de espera:

var xhrTimeout; 
var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://blah.com/etc", true); 
xhr.onreadystatechange = function() 
{ 
    if (xhr.readyState == 4) 
     window.clearTimeout(xhrTimeout); 
} 
xhr.send(); 
xhrTimeout = window.setTimeout(function() 
{ 
    xhr.abort(); 
    failFunction(); 
}, 300000); // 5 mins 
+0

soy usando jQuery. Así que, básicamente, tendría que ajustar mi llamada a WebService.invoke con $ .ajax (timeout: 50000, WebService.invoke (...);) ¿Similar a eso? – karlgrz

+0

@KG: puede usar '$ .ajaxSetup()' para establecer la propiedad de tiempo de espera que se aplicará globalmente a todas las llamadas realizadas con '$ .ajax()'. Ver mi respuesta actualizada. –

+0

Voy a intentar esto, gracias! – karlgrz

3

La forma en que lo haría sería el siguiente (muy psuedocode bruto):

InvokeWebService 
setTimeout 

onTimeout: 
    cancelInvokation 
    DoOtherStuff 

onWebServiceCompletion: 
    cancelOnTimeout 
Cuestiones relacionadas