2009-06-14 11 views
4

Gibt es eine Möglichkeit, auf die jQuery-Methode getJSON zu warten?Warten, bis JSON-Daten analysiert wurden

Ich möchte die Daten analysieren, erhalten mit dieser Funktion und nur falsch/wahr zurückgeben, wenn eine bestimmte Zeichenfolge enthalten ist. Aufgrund der asynchronen Datenverarbeitung scheint dies jedoch nicht so einfach zu sein. Hier ist ein Code-Schnipsel:

contained = false; 

$.getJSON(URL, function (data) { 
    $.each(data, function(i, item) { 
     if (item.Info.code == code) contained = true; 
    }); 
}); 

Nach thid Code, die Funktion, wo dieser Code platziert wird in, gibt den ‚‘ enthaltenen Wert, whis grundsätzlich falsch ist, weil getJSON noch nicht abgeschlossen ist.

Antwort

6

Sie könnten versuchen, eine synchrone Anforderung tun, wie folgt aus:

$.ajax({ 
     type: "GET", 
     url: "www.foo.com", 
     data: data 
     async: false, 
     dataType: "json" 
    }); 
+0

schlug mich durch ein paar Augenblicke +1 – ichiban

8

Die richtige Lösung ist nicht synchron zu machen (dies ist möglich, aber nicht empfehlenswert). Es verwendet einen Rückruf entsprechend. Async-Programmierung ist gewöhnungsbedürftig, aber es lohnt sich.

Statt:

function foo() 
{ 
    ... 

    contained = false; 

$.getJSON(URL, function (data) { 
     $.each(data, function(i, item) { 
      if (item.Info.code == code) contained = true; 
     }); 
    }); 

    // Do something with contained 
} 

tun:

function getContained(containedCallback) 
{ 
    $.getJSON(URL, function(data) 
    { 
    var contained = false; 
    $.each(data, function(i, item) { 
     if (item.Info.code == code) contained = true; 
    }); 
    containedCallback(contained); 
    } 
); 
} 

function foo() 
{ 
    ... 
    getContained(function(contained) 
    { 
    // Do something with contained 
    }); 
} 
+1

+1 Ich weiß nicht, warum die Leute Rückrufe in Javascript wider so viel ... –

+0

Whoa, ich habe noch nie gesehen JavaScript verwendet wie Das vorher. Ich habe diese Frage nur für diese Antwort bevorzugt. – Strawberry

5

Dank für Ihre Antwort danken. Ich habe nur den Prozess auf synchron gesetzt:

$.ajaxSetup({'async': false}); 

Danach wurde mein Code verwendet. Funktioniert gut!

Mehr jQuery Ajax Optionen here

+0

Danke für den Tipp, ich brauchte eine schnelle Lösung und asynchron wird mir in dieser Situation keine zusätzliche Leistung bringen. – Shard

+0

Vielen Dank dafür! –