65 votes

jQuery.quand la compréhension

Je suis en train d'utiliser le jQuery.les tirs de deux requêtes ajax et ensuite appeler la fonction après les deux demandes ont terminé. Voici mon code:

var count = 0;
var dfr;

var showData = function(data) {
    dfr.resolve();
    alert(count);
   // Do something with my data data received
};

var method1 = function() {
    dfr = $.Deferred();

    return $.ajax('localhost/MyDataService/DataMethod_ReturnsData', {
        dataType: "jsonp",
        jsonp: "$callback",
        success: showData
    });
};

var method2 = function() {
    return $.ajax('localhost/MyDataService/DataMethod_ReturnsCount', {
        dataType: "jsonp",
        jsonp: "$callback",
        success: function(data) {
            count = data.d.__count;
        }
    });
};

$.when(method1(), method2())
    .then(showData());

Toutefois, cela ne fonctionne pas comme prévu. Appel Ajax dans method1 renverra les données qui seront utilisées dans showData() et de l'appel Ajax dans method2 sera de retour le comte qui est assined à var comte et plus tard utilisé dans showData().

Mais quand je lance le code ci-dessus, method1 est appelée, puis method2 et puis showData laisser les données dans showData comme "indéfini". Comment puis-je obtenir ce par le biais d' $.quand, qui, autant que je sache produit uniquement lorsque les deux fonctions retournant $.promesse qui sont exécutées. Je veux que les deux appels ajax doit être appelé en parallèle et, plus tard, être affichés les résultats sur la base des résultats des deux appels.

73voto

Guillaume86 Points 7812
function showData(data1, data2) {
    alert(data1[0].max_id);
    alert(data2[0].max_id);
}

function method1() {
    return $.ajax("http://search.twitter.com/search.json", {
        data: {
            q: 'ashishnjain'
        },
        dataType: 'jsonp'
    });
}

function method2() {
    return $.ajax("http://search.twitter.com/search.json", {
        data: {
            q: 'ashishnjain'
        },
        dataType: 'jsonp'
    });
}

$.when(method1(), method2()).then(showData);​

Voici un travail jsFiddle

34voto

Matt Ball Points 165937

Le problème, c'est que vous êtes en passant showData() de then(), pas showData. Vous devez passer une référence à une fonction d' .then():

$.when(method1(), method2())
    .then(showData);

ou

$.when(method1(), method2())
    .then(function () {
        showData();
    });

Modifier

J'ai mis en place un travail de démonstration. Une partie du problème (au moins dans le fragment de code que vous avez posté) est qu'il n'y a pas de fonction de rappel nommé $callback. Une partie du problème était l' $ dans le nom de rappel '$callback'.

Donc, supprimer l' jsonp: '$callback' ajax option, de sorte que jQuery par défaut une fonction de rappel nommé callback, et de définir une fonction de même nom, et tout cela fonctionne.

-4voto

Haresh Vidja Points 39

J'ai peu modifié votre code et plus simple à comprendre... je n'ai pas le tester merci d'essayer

var count = 0;
function countResponse(data) {
    count++;
    if(count==2)
    {
        // Do something after getting responce from both ajax request
    }
};

var method1 = function() {
    return $.ajax('localhost/MyDataService/DataMethod_ReturnsData', {
        dataType: "jsonp",
        jsonp: "$callback",
        success: function(data) {
            countResponse(data)
        }
    });
};

var method2 = function() {
    return $.ajax('localhost/MyDataService/DataMethod_ReturnsCount', {
        dataType: "jsonp",
        jsonp: "$callback",
        success: function(data) {
            countResponse(data)
        }
    });
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X