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
}
76
demandé sur Cerbrus 2013-02-07 19:19:58

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

81
répondu Cerbrus 2017-05-23 12:03:02

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.

170
répondu Alnitak 2014-03-21 08:26:26

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.

12
répondu BinaryTox1n 2013-02-07 16:00:14

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
5
répondu Undefined 2013-02-07 15:22:05

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
    })
}
3
répondu jbl 2013-02-07 15:22:22

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 )

1
répondu Lukas Bijaminas 2013-02-07 15:22:31

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>
1
répondu Võ Minh 2018-02-12 04:57:10

dans votre composant I. e Code angulaire JS:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
-1
répondu Shivani Jadhav 2018-06-05 09:47:52