jQuery ajax succès fonction de rappel définition
je veux utiliser jQuery ajax pour récupérer des données à partir d'un serveur.
je veux placer la définition de fonction de rappel de succès en dehors du bloc .ajax()
comme suit. Est-ce que je dois déclarer la variable dataFromServer
comme ce qui suit pour que je puisse utiliser les données retournées à partir du succès callback?
j'ai vu la plupart des gens définir le succès callback à l'intérieur du bloc .ajax()
. Donc le code suivant est correct si je souhaitez définir le succès de rappel à l'extérieur?
var dataFromServer; //declare the variable first
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData(dataFromServer)
})
}
function handleData(data) {
alert(data);
//do some stuff
}
8 réponses
il suffit d'utiliser:
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
la propriété success
ne nécessite qu'une référence à une fonction, et passe les données comme paramètre à cette fonction.
vous pouvez accéder à votre fonction handleData
comme ceci à cause de la façon dont handleData
est déclaré. JavaScript analysera votre code pour les déclarations de fonction avant de l'exécuter, vous serez donc en mesure d'utiliser la fonction dans le code qui est avant la déclaration réelle. Ceci est connu comme hissage .
cela ne compte pas pour les fonctions déclarées comme ceci, bien que:
var myfunction = function(){}
Ceux ne sont disponibles que lorsque l'interprète passé.
voir cette question pour plus d'informations sur les 2 façons de déclarer les fonctions
la "nouvelle" façon de faire ceci depuis jQuery 1.5 (Jan 2011) est d'utiliser des objets différés au lieu de passer un appel success
. Vous devez retourner le résultat de $.ajax
et ensuite utiliser les méthodes .done
, .fail
etc pour ajouter les callbacks en dehors de $.ajax
appel .
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */ ) {
alert(data);
//do some stuff
}
getData().done(handleData);
Ce découple le rappel de la manipulation de l'AJAX manipulation, permet vous devez ajouter des callbacks multiples, des callbacks de panne, etc, le tout sans jamais avoir besoin de modifier la fonction getData()
originale. Séparer la fonctionnalité AJAX de l'ensemble des actions à accomplir ensuite est une bonne chose! .
Deferreds permettent également une synchronisation beaucoup plus facile de multiples événements asynchrones, ce que vous ne pouvez pas facilement faire juste avec success:
par exemple, je pourrais ajouter plusieurs callbacks, un gestionnaire d'erreur, et d'attendre une minuterie pour s'écouler avant de poursuivre:
// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);
// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);
$.when(timer, ajax).done(function() {
// this won't be called until *both* the AJAX and the 5s timer have finished
});
ajax.done(function(data) {
// you can add additional callbacks too, even if the AJAX call
// already finished
});
D'autres parties de jQuery utilisent aussi des objets différés - vous pouvez synchroniser très facilement les animations jQuery avec d'autres opérations asynchrones.
Je ne sais pas pourquoi vous définissez le paramètre en dehors du script. Qui est inutile. Votre fonction de rappel sera appelée automatiquement avec les données de retour comme paramètre. Il est très possible de définir votre callback en dehors du sucess:
i.e.
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
function handleData(data) {
alert(data);
//do some stuff
}
la fonction handleData sera appelée et le paramètre lui sera transmis par la fonction ajax.
essayez de réécrire votre succès handler à:
success : handleData
la propriété de succès de la méthode ajax ne nécessite qu'une référence à une fonction.
dans votre fonction handleData vous pouvez prendre jusqu'à 3 paramètres:
object data
string textStatus
jqXHR jqXHR
j'écrirais:
var dataFromServer; //declare the variable first
var handleData = function (data) {
alert(data);
//do some stuff
}
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
Vous n'avez pas besoin de déclarer les variables. La fonction de succès Ajax prend automatiquement jusqu'à 3 paramètres: Function( Object data, String textStatus, jqXHR jqXHR )
après quelques heures jouer avec elle et presque devenir terne. miracle est venu à moi, ça a marché.
<pre>
var listname = [];
$.ajax({
url : wedding, // change to your local url, this not work with absolute url
success: function (data) {
callback(data);
}
});
function callback(data) {
$(data).find("a").attr("href", function (i, val) {
if( val.match(/\.(jpe?g|png|gif)$/) ) {
// $('#displayImage1').append( "<img src='" + wedding + val +"'>" );
listname.push(val);
}
});
}
function myfunction() {
alert (listname);
}
</pre>
dans votre composant I. e Code angulaire JS:
function getData(){
window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}