Si vous utilisez $ .post dans une fonction javascript, vous ne pouvez pas affecter de valeur à une variable

StackOverflow https://stackoverflow.com/questions/824431

  •  05-07-2019
  •  | 
  •  

Question

J'essaie d'utiliser $ .post dans une fonction, obtenir les résultats, puis renvoie la fonction true ou false en fonction des résultats du rappel $ .post. Cependant, le rappel semble se produire, APRÈS l'événement de retour de la fonction parent.

Voici le code actuel, la variable ret est toujours indéfinie, mais si je l’alerte () dans le rappel $ .post, elle renvoie le résultat correct;

function elementExists(key, type, path, appid, pid){
    var ret;
    $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
        ret = data;                         
    });

    alert(ret);
    return ret;

}
Était-ce utile?

La solution

Comme vous l'avez découvert, la publication est faite de manière asynchrone. Si vous voulez qu'il soit synchrone, vous devrez utiliser le ajax et définissez le paramètre async sur false. Il serait toutefois préférable de reconnaître que la publication est asynchrone et de construire votre code de sorte que l'action effectuée par le rappel soit indépendante de la méthode qui appelle la publication. Évidemment, vous voulez vraiment faire autre chose que l'alerte, mais sans savoir ce qu'il est difficile de vous conseiller sur la façon de reformuler cela.

MODIFIER : je comprends que votre code vérifie si quelque chose existe, mais il vérifie cela dans un but précis. Si nous savions quel était le but, il serait alors possible de recommander comment y parvenir dans le rappel afin que la méthode puisse être refactorisée.

Autres conseils

function elementExists(key, type, path, appid, pid){
        $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
           alert(data);
        });
  }

la fonction (données) est un rappel (asynchrone). Vous ne pouvez pas renvoyer de telles valeurs.

si le rappel n’est pas appelé tant que la page n’a pas été appelée, mais votre "return ret". est en cours d'exécution immédiatement après avoir appelé $ .post

Si vous souhaitez le définir de manière syncrone, définissez async: false

Voir la documentation http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype

Le problème est que votre code s'exécute de manière asynchrone. C'est alert (ret) est effectivement appelé avant ret = data, ce qui se produit lorsque la demande Ajax est terminée.

Vous pouvez rendre vos appels ajax synchrones (non recommandé) à l'aide de async option, ou reconcevoir votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top