2009-03-06 4 views
0

Wenn ich innerhalb meiner XHR onreadystatechange Funktion bin, kann ich einfach tun document.title = xhr.responseText, aber wenn ich die Funktion den responseText zurückgeben, kann ich keine Variable gleich meiner XMH-Wrapper, um es gleich der Antwort; Gibt es einen Weg, dies zu tun?Warum kann ich keine Variable setzen, die einem responseText-Wert von XMLHttpRequest entspricht?

Mein Wrapper:

ajax = function(url, cb) 
{ 
    xhr = (window.XMLHttpRequest) 
     ? new XMLHttpRequest() 
     : new ActiveXObject('Microsoft.XMLHTTP'); 
    xhr.onreadystatechange = function() 
    { 
     if (xhr.readyState == 4 && xhr.status == 200) 
     { 
      cb(xhr.responseText); 
     }; 
    } 
    xhr.open('get', url, true); 
    xhr.send(); 
}; 

Nun, wenn ich so etwas tat:

ajax('bacon.txt', function(_) 
{ 
    document.title = _; 
} 

funktioniert es absolut perfekt; document.title wird tatsächlich zum responseText des Aufrufs von bacon.txt. Wenn ich jedoch versuche, es so zu implementieren:

keine solche Glück. Kann jemand klären, warum das so ist? };

+0

Code für den Wrapper wird dazu beitragen, es besser zu verstehen. – shahkalpesh

+0

Sie haben Ihre Variable wahrscheinlich nicht außerhalb des Bereichs Ihrer Funktion deklariert. –

Antwort

7

Sie weisen dem Titel die Rückgabe der Ajax-Funktion zu. Die Ajax-Funktion selbst gibt nichts zurück.

Der springende Punkt von AJAX ist, dass die Funktion sofort zurück, hat es die Anfrage an den Server, vor jede Antwort eingegangen ist. Sie ordnen der title-Eigenschaft undefined zu (Übrigens, ich habe normalerweise meine Ajax-Funktion zurückgeben die Xhr verwendet wird, so dass ich bei Bedarf abbrechen kann).

Wenn die Anfrage abgeschlossen ist, wird die Callback-Funktion (die cb in Ihrem Code) aufgerufen, daher ist Ihr ursprünglicher Code sinnvoll, er übernimmt die Zuweisung.

+0

+1: Wenn Sie "return 'send request';" nach xhr.send(); du magst erleuchtet sein. – Greg

0

das Ergebnis der onreadystatechange -Funktion ist nicht das gleiche Ihre "ajax" -Funktion ... Sie könnten Ihre Post-Sync, und machen die Ajax-Funktion die gleiche Rückkehr, aber es wird am Ende der Benutzerantwort in der verzögern Browser, wenn die Antwort zu lange dauert.

Je besser Sie es tun, desto besser können Sie einen anderen Weg finden. Ich meine, versuche nicht, es so zu machen, weil es schlimmer wird.

Verwandte Themen