11
votes

JQuery Ajax Retour: non défini

Je suis sûr que vous connaissez ce problème, j'essaie toujours de le résoudre pendant quelques jours. J'ai essayé beaucoup de choses, mais personne n'a fonctionné:

Voici le code xxx

alerte (résultat); montrera 1 mais lors de l'utilisation d'une autre fonction, il est indiqué non défini .


5 commentaires

Qu'entendez-vous par «lors de l'utilisation d'une autre fonction»?


Faites-vous une alerte (lobbobleader ()); et récupérez non défini ?


"Êtes-vous alerte (lobbobleader ()); et revenir indéfini?" Oui


"Que voulez-vous dire par" lors de l'utilisation d'une autre fonction "?" Comme ceci: si (lobbobleader () == 1) {


Dupliqué possible de Comment retourner la réponse d'un appel Ajax? < / a>


5 Réponses :



15
votes

Vous ne pouvez pas retour code> à partir d'une fonction asynchrone comme celle-ci, vous revenez à partir de cette fonction succès code> Callback, pas la fonction mère. Au lieu de cela, lancez tout ce dont vous avez besoin dans le rappel, comme celui-ci:

function lobbyLeader() {
  $.ajax({
    data: {"id": 1, "request": "lobbyinfo", "method": "read"},
    url: 'api.php',
    dataType: 'json',
    success: function(data){
      someOtherFunc(data.leader);
   }
 });
}


7 commentaires

J'ai fusionné les deux fonctions: Pastebin.com/Runigzsd Pouvez-vous me dire comment réellement le réparer?


@Nightbox - au lieu de si (fonction (données.leader) { vous avez besoin si (data.leader) {


@Nnighbox - Est-ce ce que vous êtes après? jsfiddle.net/nick_craver/qlalj


HMM Il existe 2 appels AJAX différents, devrais-je les combiner dans PHP en un seul et obtenir ces données?


@Nnighbox - Yup, c'est ce que je ferais, il suffit d'avoir 2 propriétés sur le JSON retourné, beaucoup plus simple :)


yep, en permanence était mieux ty


Existe-t-il une solution qui n'implique pas à faire fonctionner une fonction distincte? Parce que la création d'une autre fonction signifie que vous ne pouvez pas avoir une fonction polyvalente pour les demandes AJAX



1
votes

Lorsque vous Retour Valeurs de l'intérieur d'une fonction anonyme exécutée de manière asynchrone, ces valeurs ne dépendent pas de la chaîne d'étendue, l'instruction retour est uniquement appliquée sur le courant. Portée de la fonction, pas la portée environnante, $. Ajax () est asynchrone, donc immédiatement après avoir exécuté la déclaration, la fonction externe retourne, il n'y a donc pas de valeur de retour de la fonction extérieure, c'est pourquoi vous " revenir au non défini .

Le seul moyen de connecter une valeur de retour possible de la fonction de rappel passée à $. Ajax est d'appeler une autre fonction extérieure, passant dans les données souhaitées.


0 commentaires

2
votes

Je recommande de cette façon.

  1. Utilisez l'appel Ajax par l'ASYNC: FALSE. LI>
  2. Déplacez l'instruction de retour après l'appel AJAX. LI> ol>

    Exemple: p> xxx pré>

    Vous pouvez tester la méthode suivante. p>

    (dans l'autre fichier (HTML ou JS))

    var gridData = makeJQGridDataFromList(openAPIUrl);
    console.debug(">> " + JSON.stringify(gridData));
    


0 commentaires

6
votes

correctement indiqué que vous ne pouvez pas vraiment revenir du succès, cependant, si vous faites ce que vous pensez que vous faites, et c'est à saisir les données et à le renvoyer et à l'attribuer à quelque chose dans une autre zone, c'est-à-dire

var obj = lobbobleader (); p>

alors vous pouvez simplement définir la fonction ASYNC: Faux et renvoyez l'OBJ en dehors du succès après la fin du code. Exemple P>

function lobbyLeader() {
var obj;
  $.ajax({
    async:false;
    data: {"id": 1, "request": "lobbyinfo", "method": "read"},
    url: 'api.php',
    dataType: 'json',
    success: function(data){
      obj= JSON.parse(data);
   }
 });
    return obj;
}


2 commentaires

"Aussi de JQuery 1.8 [Il y a trois ans!] L'utilisation de Async: Faux avec JQXHR ($ .DOne () ou le JQXHR.SUCCESSÉ (). " API.JQUERY.com/JQUERY.AJAX Les promesses ne sont pas si difficiles à apprendre, c'est vaut la peine. Certes, une amélioration sur le blocage de votre UI entière jusqu'à ce que la demande soit terminée.


Je suis confronté au même problème. Vous avez sauvé ma journée @matt. De plus, je n'ai pas défini la fonction sur async: false et obtenu la sortie correcte.