Je veux utiliser ajax jQuery pour récupérer des données d'un serveur.
Je souhaite placer la définition de la fonction de rappel de succès en dehors du bloc .ajax()
comme ci-dessous. Alors, dois-je déclarer la variable dataFromServer
comme ci-dessous pour pouvoir utiliser les données renvoyées par le rappel de réussite?
J'ai vu la plupart des gens définir le rappel de réussite à l'intérieur du bloc .ajax()
. Le code suivant est-il donc correct si je veux définir le rappel de réussite à 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
}
Il suffit d'utiliser:
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
La propriété success
nécessite uniquement une référence à une fonction et transmet les données en tant que paramètre à cette fonction.
Vous pouvez accéder à votre fonction handleData
de cette manière à 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 pourrez donc utiliser la fonction dans le code qui précède la déclaration. Ceci est appelé levage .
Cela ne compte pas pour les fonctions déclarées comme ceci, cependant:
var myfunction = function(){}
Celles-ci ne sont disponibles que lorsque l'interprète les a passées.
Voir cette question pour plus d'informations sur les 2 façons de déclarer des fonctions
La "nouvelle" façon de procéder depuis jQuery 1.5 (janvier 2011) consiste à utiliser des objets différés au lieu de transmettre un rappel success
. Vous devriez retourner le résultat de $.ajax
, puis utiliser les méthodes .done
, .fail
etc pour ajouter les rappels en dehors de $.ajax
call.
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */ ) {
alert(data);
//do some stuff
}
getData().done(handleData);
Ceci découple la gestion des rappels de la manipulation AJAX, vous permet d'ajouter plusieurs rappels, des rappels d'échec, etc., sans avoir à jamais modifier la fonction getData()
d'origine. Séparer la fonctionnalité AJAX de l'ensemble des actions à exécuter ultérieurement est ne bonne chose!.
Les différés permettent également une synchronisation beaucoup plus facile de plusieurs événements asynchrones, ce que vous ne pouvez pas facilement faire simplement avec success:
Par exemple, je pourrais ajouter plusieurs rappels, un gestionnaire d'erreurs et attendre qu'un minuteur se soit écoulé avant de continuer:
// 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 également des objets différés: vous pouvez très facilement synchroniser des animations jQuery avec d'autres opérations asynchrones.
Je ne sais pas pourquoi vous définissez le paramètre en dehors du script. C'est inutile. Votre fonction de rappel sera appelée avec les données de retour en tant que paramètre automatiquement. Il est très possible de définir votre rappel 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 gestionnaire de réussite pour:
success : handleData
La propriété success de la méthode ajax nécessite uniquement une référence à une fonction.
Dans votre fonction handleData, vous pouvez prendre jusqu'à 3 paramètres:
object data
string textStatus
jqXHR jqXHR
Je souhaiterai écrire :
var handleData = function (data) {
alert(data);
//do some stuff
}
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
après quelques heures, jouez avec et devenez presque ennuyeux. Le miracle m'est venu, ça marche.
<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>
Vous n'avez pas besoin de déclarer la variable. La fonction de réussite Ajax prend automatiquement jusqu'à 3 paramètres: Function( Object data, String textStatus, jqXHR jqXHR )