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?

0
chris 10 oct. 2011 à 12:36

4 réponses

Meilleure réponse

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*/});
});
6
Matt 15 nov. 2011 à 16:45

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() {...});
    }
});
3
arunkumar 10 oct. 2011 à 08:45

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.

-3
Ariel 10 oct. 2011 à 08:42

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);
}
1
Ariel 10 oct. 2011 à 08:43
7710287