2009-06-24 2 views
1

Immer wieder bekomme ich diesen Fehler in IE beim Erstellen einer AJAX-Anforderung an einen Handler, der eine kleine Antwort vom Typ text/plain zurückgibt. Es scheint, dass dieser Fehler beginnt, passiert ein paar Mal, und dann wird es aufhören. Sehr nervig.AJAX-Fehler: Die Daten, die für diesen Vorgang erforderlich sind, sind nicht verfügbar

Ich verwende die neueste jQuery-Bibliothek. Der Fehler löst die Funktion complete() aus, wenn ich versuche, auf xhr.responseText zuzugreifen. Wie kann ich das verhindern?

Haben Sie versucht, mit success statt complete:

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

Antwort

0

Wie sich herausstellt, wurde der Fehler verursacht, weil die readyState Eigenschaft von XmlHttpRequest bei 3 war, was bedeutet, dass die Anfrage noch in Bearbeitung ist. Ich verstehe nicht, warum jQuery meine komplette Funktion abfeuert, bevor readyState 4 ist! Ich habe dies an der Spitze meines Erfolgs-Callback, und habe nicht den Fehler, da ...

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

Dies ist eine sehr hässliche Lösung gesehen, die ich hasse, aber es scheint, das Problem zu beheben.

0

Ich habe nicht die jQuery Ajax-Funktionalität direkt, so dass ich nur irgendwie raten hier, aber verwendet?

Haben Sie andere dataType s versucht? Basierend auf the jQuery documentation, würde ich nicht erwarten, dass der Text dataType ein Objekt zurückgibt, aber das scheint unwahrscheinlich, das Problem zu sein, wenn es die meiste Zeit funktioniert.

+0

Danke. Der "komplette" Callback wird nach "Erfolg" aufgerufen, also glaube ich nicht, dass er irgendwas hilft, aber es ist wahrscheinlich einen Versuch wert. Wenn ich einen anderen dataType benutze, wird jQuery versuchen, ihn zu verarbeiten, was ich nicht will, weil der Handler eine einfache Textzeichenfolge zurückgibt. –

1

Ich weiß, diese Frage ist über einen Monat alt, aber ich denke, ich weiß, was Ihr Problem war.

Der Rückruf complete() wird ausgeführt, nachdem sowohl success() als auch error() aufgerufen wurden. In Ihrem Fall vermute ich, dass Ihr Anruf abgelaufen ist. Wenn Sie also einen Fehlerrückruf geliefert hätten, hätte er ausgelöst, aber in diesem Fall wird complete() mit readyState bei 3 aufgerufen. Erhöhen Sie einfach Ihr Zeitlimit und/oder prüfen Sie dies Fehlerstatus