Définition de la fonction de rappel de succès jQuery ajax

89

Je souhaite utiliser jQuery ajax pour récupérer des données d'un serveur.

Je veux mettre la définition de la fonction de rappel de succès en dehors du .ajax()bloc comme suit. Dois-je donc déclarer la variable dataFromServercomme suit afin de 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 succès à l'intérieur du .ajax()bloc. Le code suivant est-il donc correct si je souhaite 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
}
Tonga
la source

Réponses:

93

Utilisez simplement:

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

La successpropriété 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 handleDatafonction de cette manière en raison de la manière dont elle handleDataest déclarée. 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 réelle. C'est ce qu'on appelle le levage .

Cela ne compte cependant pas pour les fonctions déclarées comme ceci:

var myfunction = function(){}

Ceux-ci ne sont disponibles que lorsque l'interprète les a passés.

Voir cette question pour plus d'informations sur les 2 façons de déclarer des fonctions

Cerbrus
la source
1
@Alnitak, quand la deferred objectschose a-t-elle été présentée? Je ne l'ai jamais vu. De plus, cela semble un peu compliqué, car le code qui définit le rappel à utiliser se trouve dans un emplacement différent de l'appel AJAX réel.
Cerbrus
4
il a été introduit dans jQuery 1.5 et c'est beaucoup moins compliqué que d'utiliser success:. Découpler le rappel de l'AJAX est une bonne chose! Voir les notes que je viens d'ajouter à la fin de ma réponse.
Alnitak
@Alnitak, je vais jeter un œil. Voyons si je peux être convaincu: P
Cerbrus
@Alnitak: Les objets différés sont-ils toujours préférés au rappel de réussite? Merci.
tonga
@tonga IMHO, oui, très préféré. Si votre code avait été utilisé $.get()par exemple, il aurait été impossible d'ajouter un error:gestionnaire car $.getne le prend pas en charge. Cependant, vous pouvez ajouter un .failau résultat différé de $.get.
Alnitak
198

La "nouvelle" façon de faire cela depuis jQuery 1.5 (janvier 2011) est d'utiliser des objets différés au lieu de passer un successrappel. Vous devez renvoyer le résultat de $.ajax, puis utiliser les méthodes .done, .failetc pour ajouter les rappels en dehors de l' $.ajaxappel .

function getData() {
    return $.ajax({
        url : 'example.com',
        type: 'GET'
    });
}

function handleData(data /* , textStatus, jqXHR */ ) {
    alert(data);
    //do some stuff
}

getData().done(handleData);

Cela dissocie la gestion des rappels de la gestion AJAX, vous permet d'ajouter plusieurs rappels, des rappels d'échec, etc., le tout sans jamais avoir besoin de modifier la getData()fonction d' origine . Séparer la fonctionnalité AJAX de l'ensemble des actions à effectuer par la suite est une bonne chose! .

Les différés permettent également une synchronisation beaucoup plus facile de plusieurs événements asynchrones, ce que vous ne pouvez pas faire facilement avec success:

Par exemple, je pourrais ajouter plusieurs rappels, un gestionnaire d'erreurs et attendre qu'un minuteur s'écoule 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 les animations jQuery avec d'autres opérations asynchrones.

Alnitak
la source
1
@Cerbrus voyez le nouvel exemple, puis réfléchissez à la façon dont vous le feriez sans objets différés
Alnitak
Les objets différés @jbl sont fantastiques. Normalement, je déconseille toute réponse qui favorise l'utilisation de success:parce que les différés fonctionnent tellement mieux.
Alnitak
@Cerbrus c'est exactement comme ça que c'est censé être interprété. Je vous suggère de rechercher ici user:6782 deferredde nombreux autres exemples.
Alnitak
Comment pourrait-on utiliser cela avec un événement de soumission de formulaire?
haakym
Ce alertbien ... Personnellement , je l' utilise console.log(data)ou si elle est un tableau: console.table(data):)
Armstrongest
16

Je ne sais pas pourquoi vous définissez le paramètre en dehors du script. Cela n'est pas nécessaire. Votre fonction de rappel sera appelée avec les données de retour comme paramètre automatiquement. Il est très possible de définir votre callback en dehors du sucess:ie

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.

BinaryTox1n
la source
6

Essayez de réécrire votre gestionnaire de succès pour:

success : handleData

La propriété success 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
Indéfini
la source
5

Je souhaiterai écrire :

var handleData = function (data) {
    alert(data);
    //do some stuff
}


function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}
jbl
la source
15
Votre code n'utilise jamais réellement dataFromServerpour que la première ligne puisse être supprimée.
Anthony Grist
2

après quelques heures, jouez avec et devenez presque terne. 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>
Võ Minh
la source
1
vous n'avez pas besoin de mettre un autre appel de fonction pour réussir. vous pouvez directement dire que success : callbackjquery déclenchera votre fonction appelée callbackavec le dataparamètre en elle.
Olgun Kaya
1

Vous n'avez pas besoin de déclarer la variable. La fonction de succès Ajax prend automatiquement jusqu'à 3 paramètres:Function( Object data, String textStatus, jqXHR jqXHR )

Lukas Bijaminas
la source
-1

Dans votre composant ie code JS angulaire:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
Shivani Jadhav
la source