2009-06-14 10 views
4

Existe-t-il un moyen d'attendre la méthode getJSON de jQuery?En attente de l'analyse des données JSON

Je veux analyser les données, recevoir cette fonction et retourner juste false/true si une chaîne spécifique est contenue. Mais en raison du traitement des données asynchrone, cela ne semble pas si simple. Voici un extrait de code:

contained = false; 

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

Après le code thid, la fonction, où ce code est placé dans, renvoie la valeur « contenue », whis est fondamentalement faux, parce que getJSON n'a pas encore fini.

Répondre

6

Vous pouvez essayer de faire une demande synchrone, comme ceci:

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

m'a battu par quelques quelques secondes +1 – ichiban

8

La bonne solution ne rend synchrone (cela est possible, mais pas recommandé). Il utilise un rappel de manière appropriée. La programmation asynchrone nécessite de s'y habituer, mais ça vaut le coup.

Au lieu de:

function foo() 
{ 
    ... 

    contained = false; 

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

    // Do something with contained 
} 

faire:

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 Je ne sais pas pourquoi les gens résistent callbacks en Javascript tellement ... –

+0

Whoa, je ne l'ai jamais vu utilisé comme JavaScript ceci avant. J'ai favorisé cette question juste pour cette réponse. – Strawberry

5

Merci pour votre réponse. Je viens de mettre le processus à synchrone:

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

Ensuite, utilisé mon code. Travailler très bien!

Plus d'options Ajax jQuery here

+0

Merci pour le conseil, j'avais besoin d'une solution rapide et asynchrone ne va pas me donner des performances supplémentaires dans cette situation. – Shard

+0

Merci pour ça! –

Questions connexes