Si j'utilise une fermeture pour définir quelque chose, y a-t-il un moyen d'attendre pour ainsi dire jusqu'à ce que la variable soit remplie avant de passer au bit suivant.
Exemple:
var myVari = someFunction();
$.each(myVari, function(){/*code for each*/});
La fonction qui définit myVari est un appel AJAX, qui peut prendre une seconde ou 4 (oui ce n'est pas trop rapide) pour définir la variable. Le problème est que, avant que l'appel AJAX ne donne ses résultats, $ .each a déjà été déclenché et s'est trompé car myVari était vide. Existe-t-il une meilleure façon d'aborder ce scénario?
4 réponses
Vous devez adapter votre code afin de pouvoir passer un rappel à someFunction
, que vous exécutez lorsque l'appel AJAX est terminé.
La seule façon que vous pouvez attendre pour que l'appel AJAX se termine est de changer l'appel en synchrone, mais cela est lourdement découragé car il se verrouille complètement le navigateur pour la durée de l'appel AJAX.
Comme vous utilisez déjà la bibliothèque jQuery, ce processus de callbacks
devient beaucoup plus facile. Au lieu de renvoyer la variable comme vous le faites actuellement, je retournerais l'objet jQuery AJAX (qui a une interface de promesse à partir de 1.6), vous pouvez donc facilement y ajouter des rappels:
function someFunction () {
return jQuery.ajax('some/url.php', {
// whatever
});
}
var myVari = someFunction();
myVari.done(function (data) {
$.each(data, function(){/*code for each*/});
});
Si je comprends ce que vous essayez de faire, alors vous pouvez essayer votre $ .each dans le gestionnaire de «succès» de votre appel ajax.
Réécrivez someFunction à quelque chose comme -
var myVari; //define this here or in whichever calling scope where it needs to be available.
$.ajax({
'url': 'http://..',
'type': 'GET', // or POST
'data': { } // whatever data you need to send
'success': function(data) {
myVari = process_the_server(data);
$.each(myVari, function() {...});
}
});
La façon correcte est la suivante: au lieu d'exécuter le each
seul, exécutez-le dans l'appel ajax.
Vous pourriez, je suppose, faire:
function checkFunc() {
setTimeout(function() {
if(myVari) {
$.each(........);
} else {
checkFunc();
}
}, 1000);
}
Ce n'est pas vraiment une bonne pratique de codage, mais cela fonctionnera.
Utilisez un rappel, comme ceci:
someFunction(function(myVari) {
$.each(myVari, function(){ /*code for each*/ });
});
Redéfinissez ensuite someFunction
comme ceci:
function someFunction(callback) {
var myVari;
/* ... */
/* calcuate myVari */
/* ... */
/* instead of returning it, pass it to the callback: */
callback(myVari);
}
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.