2012-10-16 6 views
0

Je fais un cauchemar en essayant de faire ça. Je dois avoir essayé environ 15 méthodes différentes à ce jour de différents messages que j'ai lus, mais tous ont échoué. J'essaie juste d'obtenir une valeur de retour d'un post ajax. Voici mon codeajax return value

var test = compareNew(this.name, "remove"); 
alert(test); 

function compareNew(obj, action) { 
    $.ajax({ 
    url: "AJAX_compare_server.php", 
    type: 'post', 
    data: { 
     compare_id: obj, 
     action: action 
    }, 
     success: function (result) { 
     var myObject = eval("(" + result + ")"); 
     alert(myObject.html); 
     return(result); 
    } 
    }); 
} 

L'alerte (myObject.html); me montre correctement le html renvoyé mais l'alerte (test); me montre 'indéfini'. J'ai passé des heures à ce sujet mais je n'arrive pas à comprendre. Pouvez-vous voir ce qui me manque?

Répondre

2

En fait return ne fonctionne pas dans un appel asynchronous mais si vous définissez async:false alors il va travailler, dans ce (appel synchrone) cas, vous pouvez essayer

function compareNew(obj, action) { 
    $.ajax({ 
     url: "AJAX_compare_server.php", 
     type: 'post', 
     data: { 
      compare_id: obj, 
      action: action 
     }, 
     success: function(result) { 
      returnresult(result); // will call the function and will alert 
     } 
    }); 
} 

function returnresult(ret){ 
    // Do whatever you want to do with the result 
    if(ret) alert(ret); 
} 
compareNew(this.name, "remove"); 

vous pouvez également utiliser comme

function compareNew(obj, action, callBack) { 
    $.ajax({ 
     //... 
     success: function(result) { 
      callBack(result); 
     } 
    }); 
} 

Et l'appeler comme

compareNew(this.name, "remove", function(data){ 
    alert(data); 
}); 
0

Les appels ajax sont asynchrones. Une fois lancé, le javascript continue à s'exécuter et votre fonction se termine. La déclaration de retour dans votre gestionnaire de succès est un retour à cette fonction anonyme, pas une déclaration de retour à votre fonction compareNew. undefined est le résultat que j'attendrais de votre script.

Ce que vous devez probablement faire est d'avoir la fonction de succès appeler une autre fonction que vous avez définie, et cette fonction devrait effectuer le travail sur la valeur renvoyée par votre appel ajax.

Si vous souhaitez que votre méthode soit synchrone, vous pouvez définir une option (probablement l'une de celles que vous avez déjà essayées). Dans votre gestionnaire de succès, définissez une variable portée à votre fonction sur la valeur que vous souhaitez renvoyer, puis, après l'appel de la méthode ajax, renvoyez cette valeur. Je recommanderais toutefois de ne pas effectuer un appel ajax synchrone, car cela empêcherait tout autre javascript de s'exécuter alors que l'appel attend d'être renvoyé, ce qui finit généralement par être une mauvaise expérience utilisateur.

+0

Vous pouvez définir async sur false, de sorte qu'en cas de succès, vous ayez déjà vos résultats. mettre ceci après votre paramètre de données: async: false, –

0

Deux choses à noter ici.

  1. Votre appel ajax est asynchrone ce qui signifie qu'il est tout à fait possible qu'il retourne après alert(test) runs.
  2. return (result) ne revient pas de compareNew. Il revient de la fonction success que vous avez créé
0

Vous ne peut pas avoir une valeur de retour de l'Ajax ..

Il est Asynchronous

0

vous utilisez return comme méthode

Corect est:

return result; 
+1

Rien ne va pas avec 'return (résultat);' (syntaxiquement) – Musa

0

Ajax étant asynchrone, le alert(test); est préformé avant la fin du résultat de l'appel ajax. C'est pourquoi vous êtes indéfini.

0

Définissez async sur false, puis définissez votre valeur de retour dans votre déclaration de succès. A la fin de votre méthode (en dehors de votre requête ajax), renvoyez le retVal.

function compareNew(obj, action) { 
    var retVal; 
    $.ajax({ 
    url: "AJAX_compare_server.php", 
    type: 'post', 
    data: { 
     compare_id: obj, 
     action: action 
    }, 
    async: false, 
    success: function (result) { 
     var myObject = eval("(" + result + ")"); 
     retVal = myOBject.html; 
     alert(myObject.html); 
    } 
    }); 
    return retVal; 
} 
1

Seules les fonctions renverront la valeur. Vous devez utiliser le retour sur le côté d'ajax .....

+0

Merci pour toutes vos réponses à tous! – Damian

0

Si vous avez firefox pour tester, vous pouvez voir comment l'appel asynchrone fonctionne en convertissant vos alertes en console.bûche(); et l'ouverture de la console. Cela vous montrera le texte que vous jetez, ainsi que vous donner une représentation visuelle (avec les données qui vont et viennent) pour votre poste ajax. vous pouvez voir comment le test var s'exécute immédiatement, et btw, si vous voulez que le test soit au moins défini, essayez d'avoir compareNew return "something"; en bas, comme si l'ajax n'existait même pas.

var test = compareNew(this.name, "remove"); 
console.log(test); 

function compareNew(obj, action) { 
    $.ajax({ 
    url: "AJAX_compare_server.php", 
    type: 'post', 
    data: { 
     compare_id: obj, 
     action: action 
    }, 
     success: function (result) { 
     var myObject = eval("(" + result + ")"); 
     console.log(myObject.html); 
     //return(result); //this line isn't gonna do anything. 
    } 
    return "something"; 
    }); 
} 

`

0

Vous ne pouvez pas obtenir une valeur de retour d'un appel asynchrone, comme une requête AJAX. La raison est que le code en attente de la réponse a déjà été exécuté au moment où la réponse est reçue. La solution consiste à exécuter le code nécessaire dans le rappel success:.

function compareNew(obj, action) { 
    $.ajax({ 
    url: "AJAX_compare_server.php", 
    type: 'post', 
    data: { 
     compare_id: obj, 
     action: action 
    }, 
     success: function (result) { 
     // Run the code here that needs 
     // to access the data returned 
     return result; 
    } 
    }); 
} 

ou peut-être vous pouvez appeler une autre fonction dans le success: rappel

function compareNew(obj, action) { 
     $.ajax({ 
     url: "AJAX_compare_server.php", 
     type: 'post', 
     data: { 
      compare_id: obj, 
      action: action 
     }, 
      success: function (result) { 
      callFuction(result) 
      return result; 
     } 
     }); 
    } 

et vous pouvez également le rendre synchrone. Vous avez besoin de async:false pour y arriver.

function compareNew(obj, action) { 
var return_this; 
$.ajax({ 
url: "AJAX_compare_server.php", 
type: 'post', 
async: false, 
data: { 
    compare_id: obj, 
    action: action 
}, 
success: function (result) { 
      return_this = result; 
    } 
    }); 
return return_this; 
}