2009-07-16 10 views
2

Hier ist mein verkürzte Code-Schnipsel:Javascript DoEvents gleichwertig?

$(document).ready(function() { 
$.get("/Handlers/SearchData.ashx", 
function(data) { 
json = $.evalJSON(data); 
}); 

//do some other stuff 

//use json data 

alert(json == null); 

}); 

Alarm sagt wahr, weil evalJson noch JSON Verarbeitung von Daten nicht erfolgt (21kb gzipped). Ich muss irgendwie warten, bis es fertig ist, bevor ich diese Daten verwende - genau das, was ich mit DoEvents in einer While-Schleife machen würde.

Antwort

3

Es gibt kein Äquivalent zu DoEvents, aber Sie können den Code setzen, die auf Ihren JSON-Daten in eine Funktion abhängt und Rufen Sie es vom AJAX-Rückruf an. Sie können auch die $ .getJSON-Methode verwenden, damit Sie den JSON nicht selbst überprüfen müssen.

$(document).ready(function() { 
    $.getJSON("/Handlers/SearchData.ashx", 
    function(data) { 
     json = data; 
     stuffToDoAfterIHaveData(); 
    }); 

    //do some other stuff 
}); 

//use json data 
function stuffToDoAfterIHaveData() { 
    alert(json == null); 
} 

Alternativ bietet jQuery eine Möglichkeit, AJAX fordert synchron zu machen (das heißt sie die Ausführung von Code zu stoppen, bis die Antwort kommt zurück). Sie können $.ajaxSetup({ async: false }); verwenden oder Sie können die Methode $.ajax direkt aufrufen und async:false im Optionsobjekt übergeben.

+0

Das hat funktioniert. Vielen Dank. – Vnuk

+0

Ich hatte keine Ahnung von .ajaxSetup. Nochmals vielen Dank. – Vnuk

3

Statt evalJSON selbst ausführen, warum nicht lassen jQuery herausfinden, wenn es fertig ist:

$.ajax({ 
    url:"/Handlers/SearchData.ashx", 
    type: "get", 
    dataType: "json", 
    success:function(d) { 
    //d now contains a JSON object, not a string. 
    alert(d==null); 
    } 
}); 
+0

Dies bezieht sich nicht auf seine Frage nach Codeausführung bis nach den XHR kehrt zu verzögern. – Prestaul

+3

Es tut es sicherlich. Die Erfolgsfunktion wird nur aufgerufen, nachdem die Anfrage und das JSON-Parsing erfolgreich waren, und löst somit beide Probleme. – Salty

2

Das einzige, was in Javascript doEvents ähnelt, ist setTimeout(). das erste Argument sollte eine Zeichenfolge mit dem Code, den Sie ausführen möchten, nachdem die "Systemereignisse" ausgeführt werden, und das zweite Argument ist die Anzahl der Millisekunden warten ... Es ist kompliziert, aber das ist die einzige Lösung, die ich kenne.

2

können Sie wie folgt verwenden:

$(document).ready(function(){ 
    json = $.parseJSON(
     $.ajax({url: '/Handlers/SearchData.ashx', async: false}).responseText 
    ) 

    alert(json == null); 
})