2010-06-09 5 views
1

Je fais quelques appels .getJSON et si l'un d'entre eux réussit, j'essaye de mettre un booléen à true pour que je puisse faire d'autres choses ailleurs sur la page. J'essayais d'utiliser la fonction .data() de jquery, mais je ne peux pas la définir depuis le callback .getJSON. par exemple:Définition de jQuery .data() dans le rappel .getJSON

$('#citations_button').data('citations', false); 

$.getJSON(apaurl, function(data) { 
    $('#apacite').html("<td class=\"bibInfoLabel\">APA Citation</td><td class=\"bibInfoData\">"+data+"</td>"); 
    $('#citations_button').data('citations', true); 
}, "html"); 

// other .getJSONs look like above... 

console.log("citations? "+$('#citations_button').data('citations')); 

imprime false, même lorsque je sais que les données sont entrées. Je pensais que cela fonctionnerait puisque .data() utilise le cache pour stocker la paire clé/valeur. comment puis-je marquer les succès ?? apprécier toute aide !!

+0

'getJSON' est un appel asynchrone, êtes-vous sûr qu'il revient avant votre appel à' console.log'? – R0MANARMY

Répondre

3

Vous devez garder à l'esprit l'ordre dans lequel votre code est réellement exécuté. Votre code sera fait exécuter dans l'ordre suivant:

$('#citations_button').data('citations', false); 
$.getJSON(apaurl, ..., "html"); 
console.log("citations? "+$('#citations_button').data('citations')); 

Puis, par la suite, lorsque la demande asynchrone revient, il fonctionnera votre fonction de rappel:

$('#apacite').html("<td class=\"bibInfoLabel\">APA Citation</td><td class=\"bibInfoData\">"+data+"</td>"); 
$('#citations_button').data('citations', true); 

Bien sûr, vous éventuellement définir citations être true, mais pas longtemps après que vous avez déjà imprimé sa valeur false sur la console. Si vous voulez faire quelque chose seulement après avoir reçu vos données JSON, ce code doit absolument être dans cette fonction de rappel (ou doit être appelé depuis cette fonction de rappel, bien sûr).

Si vous avez besoin d'attendre un résultat de tous les appels, vous pouvez faire quelque chose comme ceci:

var expectedResponses = 2; 

function gotResponsesFromAllCalls() { 
    // Do things you can only do when ALL calls have returned. 
}; 
$.getJSON(url1, function(data) { 
    // Do things specific to the return of URL 1 
    if (--expectedResponses == 0) 
     gotResponsesFromAllCalls(); 
}, "html"); 

$.getJSON(url2, function(data) { 
    // Do things specific to the return of URL 2 
    if (--expectedResponses == 0) 
     gotResponsesFromAllCalls(); 
}, "html"); 
+0

Ceci est très utile. Alors, y a-t-il un autre moyen d'atteindre mon objectif? Puis-je regrouper tous mes appels .getJSON et exécuter du code une fois qu'ils sont tous revenus? Merci! –

+0

J'ai modifié pour inclure un exemple. – VoteyDisciple

+0

bonne idée !! Je vais essayer cela merci beaucoup. –

0

Mettez ce que vous décrivez comme « faire d'autres choses ailleurs sur la page » dans un fonction. Appelez cette fonction dans le callback $ .getJSON()