Tuez un processus Javascript après un certain temps

Je m'excuse s'il s'agit d'un duplicata.

Disons que j'ai une fonction JavaScript qui appelle un service Web pour extraire des données. J'utilise une sorte de graphique en mouvement pour permettre à l'utilisateur de savoir qu'il fonctionne. Lorsqu'il est récupéré avec succès, je change le graphique en une coche. Voici mon code:

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

Ce que je voudrais est après 5 minutes, si ce processus n'a toujours pas réussi à renvoyer mes données, jeter une exception ou, mieux encore, exécuter ma fonction this.getDataFailed (this) .callback. Cela semble-t-il réalisable avec JavaScript? J'ai regardé setTimeout () et setInterval (), et ceux-ci semblent simplement retarder l'exécution d'un script, alors que je souhaite littéralement "expirer" un long processus. Des idées?

De plus, je suis ouvert à toute critique / amélioration de mon code qui permettrait cette fonctionnalité.

IE8 offre une propriété timeout et ontimeout événement sur place. Ce n'est pas standard.

J'ai remarqué que vous utilisez jQuery dans certains de vos exemples de code. JQuery prend également en charge une propriété timeout pour sa méthode ajax() qui exécutera le rappel d' error après l'atteinte de la limite d'expiration. Vous pouvez utiliser la $.ajaxSetup() pour déclarer le délai d'expiration avant de faire les appels ajax:

 $.ajaxSetup({ timeout: 300000 }); 

Si vous n'utilisez pas jQuery pour faire vos demandes, vous pouvez rouler votre propre code temporel:

 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 

La façon dont je le ferais ressemblerait à ceci (psuedocode très dur):

 InvokeWebService setTimeout onTimeout: cancelInvokation DoOtherStuff onWebServiceCompletion: cancelOnTimeout