2009-06-24 2 views
1

Je reçois de temps en temps cette erreur dans IE lors d'une requête AJAX à un gestionnaire qui renvoie une petite réponse de type text/plain. Il semble que cette erreur commencera à se produire, se produire à quelques reprises, puis s'arrêtera. Très ennuyant. J'utilise la dernière bibliothèque jQuery. L'erreur se lève dans la fonction complete() lorsque j'essaie d'accéder à xhr.responseText. Comment puis-je empêcher cela?AJAX Erreur: Les données nécessaires pour compléter cette opération sont indisponibles

$.ajax({ 
    url: "Inquire.ashx", 
    data: data, 
    dataType: "text", 
    timeout: 5000, 
    complete: function(xhr, status) { 
     var resp = xhr.responseText; // ERROR! 

     if(resp.substr(0, 4) == "http") 
     window.open(resp, "PopWin"); 
     else 
     showError(resp); 
    } 
    }); 

Répondre

0

En fait, l'erreur a été provoquée car la propriété readyState de XmlHttpRequest était à 3, ce qui signifie que la demande est toujours en cours. Je ne comprends pas pourquoi jQuery allume ma fonction complète avant que readyState ait 4 ans! Je mets cela au sommet de mon rappel de succès, et ne l'ai pas vu l'erreur depuis ...

if(xhr && xhr.readyState != 4) { 
    setTimeout(arguments.callee, 50); 
    return; 
    } 

Ceci est une solution très laid que je déteste, mais il semble résoudre le problème.

0

Je n'ai pas utilisé la fonctionnalité Ajax jQuery directement, donc je suis juste un peu de deviner, mais:

Avez-vous essayé d'utiliser success au lieu de complete?

Avez-vous essayé d'autres dataType s? Basé sur the jQuery documentation, je ne m'attendrais pas à ce que le texte dataType renvoie un objet, mais cela ne semble pas être le problème si cela fonctionne la plupart du temps.

+0

Merci. Le callback "complet" est appelé après "succès", donc je ne pense pas que cela va aider, mais ça vaut probablement la peine d'essayer. Si j'utilise un dataType différent, jQuery va essayer de le traiter, ce que je ne veux pas parce que le gestionnaire retourne une chaîne de texte brut. –

1

Je sais que cette question date de plus d'un mois, mais je pense que je connais votre problème.

Le rappel complete() est exécuté après l'appel de success() ou error(). Dans votre cas, je soupçonne que votre appel arrivait à expiration et si vous aviez fourni un rappel d'erreur, il se serait déclenché, mais dans ce cas complete() est appelé avec readyState à 3. Augmentez simplement votre délai d'attente et/ou vérifiez état d'erreur.

Questions connexes