2011-07-08 1 views
0

Question:

Tenir compte du code JavaScript ci-dessous, qui fonctionne très bien jusqu'à présent, sauf ...
... qu'il ignore complètement le délai d'attente.

Pourquoi?Pourquoi ce code JavaScript ignore-t-il le délai d'expiration?

Je l'ai testé avec sleep 10s dans le gestionnaire ashx (timeout est fixé à 5s), et jusqu'à présent, il ne s'est jamais plaint de délai d'attente. Je vais augmenter le délai d'attente pour l'utilisation en production, bien sûr.

function createXMLHttpRequest() 
{ 
    try { return new XMLHttpRequest(); } catch(e) {} 
    try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {} 
    alert("XMLHttpRequest not supported"); 
    return null; 
} 


function ExecuteSQL(strParameter1, strParameter2, strParameter3) 
{ 
    try 
    { 
     strParameter1 = encodeURIComponent(strParameter1); 
     strParameter2 = encodeURIComponent(strParameter2); 
     strParameter3 = encodeURIComponent(strParameter3); 

     var xhReq = createXMLHttpRequest(); 

     var dtNow = new Date(); 
     var dt = Date.parse(dtNow) + dtNow.getMilliseconds() 

     var params = "prm1=" + strParameter1 + "&prm2=" + strParameter2 + "&prm3=" + strParameter3 + "&prm4=END"; 


     params = params + "&NoCache=" + dt; 

     //var URLget = "cgi-bin/RequestData.ashx?NoCache=" + dt + "&param1=value1&param2=value2"; 
     var URLpost = "cgi-bin/RequestData.ashx?NoCache=" + dt; 
     xhReq.open("POST", URLpost, false); 

     //Send the proper header information along with the request 
     xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     xhReq.setRequestHeader("Content-length", params.length); 
     xhReq.setRequestHeader("Connection", "close"); 
     /* 
     xhReq.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT"); 
     */ 
     var MAXIMUM_WAITING_TIME = 5000; 

     var requestTimer = setTimeout(function() { 
      xhReq.abort(); 
      alert("Request cancelled. \nReason: Timeout (" + MAXIMUM_WAITING_TIME/1000 + "s) exceeded."); 

      // Handle timeout situation, e.g. Retry or inform user. 
     }, MAXIMUM_WAITING_TIME); 
     xhReq.send(params); 

     if (xhReq.status != 200) { 
      clearTimeout(requestTimer); 

      if (xhReq.status == 400) 
      { 
       var serverResponse = xhReq.responseText; 
       alert(unescape(serverResponse)); 
      } 
      else 
       alert("XMLHttpRequest Error\nHTTP Status: " + xhReq.status + "\nStatusText: " + xhReq.statusText); 
     } 
     else { 
      clearTimeout(requestTimer); 
      // Handle error, e.g. Dis 
      var serverResponse = xhReq.responseText; 
      alert("Successfully return from execution."); 
      //alert(unescape(serverResponse)); 
     } 

    } catch (ex) { 
     alert("Error in JavaScript-function \"ExecuteSQL\".\nError description: " + ex.Description); 
    } 
} // End Sub ExecuteSQL 
+0

est que "'" sur la ligne de l'URL var vraiment dans le code? ou est-ce une faute de frappe? –

Répondre

0

définir cette variable var requestTimer en dehors fonction ExecuteSQL

+0

Pourquoi? Je ne vois pas quelle différence cela ferait. – nnnnnn

+2

Cela ne fera aucune différence. – Malvolio

+2

Pourquoi les gens continuent à voter pour ça? –

3

Je vais supprimer tout ce qui n'a rien à voir avec la minuterie et voir si votre problème devient incroyablement évident.

function something() 
{ 
     var requestTimer = setTimeout(function() { 
      alert("something"); 
     }, 1); 

     if (something) { 
      clearTimeout(requestTimer); 
     } 
     else { 
      clearTimeout(requestTimer); 
     } 
} 
+0

sauf qu'il existe un xhReq.send (params); déclaration afer requestTimer, donc je ne vois pas ce qui est évident ici .... –

+0

Je n'ai même pas remarqué qu'il essayait de faire un appel * synchrone *. Je ne pense pas qu'une minuterie se déclenchera même lors d'un appel synchrone, ce qui est parmi les quinze principales raisons de ne pas les faire. – Malvolio

0

Vous effectuez un appel synchrone à l'aide de XMLHTTPRequest. Essayez de faire cela en changeant async false à true dans l'appel suivant:

xhReq.open("POST", URLpost, true); 

Actuellement, en raison de votre synchronisation appelez le délai d'attente est annulé.

+0

Le problème est supprimé dans cet exemple. J'ai besoin d'un appel de synchronisation, sinon je vais avoir des problèmes ailleurs (fournisseur tiers, inchangeable), c'est pourquoi je n'utilise pas JQuery. –

+1

Je reçois l'alerte timeout, s'il vous plaît voir ce violon http://jsfiddle.net/H9CsB/1/. Je reçois le délai d'attente si est l'utilisation d'une URL de domaine invalide. Si je change la valeur d'URLPost pour pointer vers localhost alors je ne reçois pas l'alerte de délai. –

Questions connexes