Question

Je travaille avec plusieurs appels différés Ajax et je voudrais être dynamique sur la façon dont j'accéder à leurs données. Plutôt que de coder en plusieurs paramètres dans la fonction de rappel en utilisant .alors et chacun individuellement, je voudrais boucle à travers l'objet arguments pour accéder aux données. Cela fonctionne très bien, sauf que je ne suis pas en mesure de déterminer à partir du JSON qui est des données à partir de laquelle l'appel Ajax. Je pouvais résoudre ce soit en déterminant l'URL de l'objet de la promesse (en quelque sorte) ou de déterminer quel ordre les appels Ajax exécuté et en supposant que les données sont dans le même ordre.

Voici mon code jusqu'à présent (raillé pour illustrer ce que je suis en train de le faire):

promises = [ 
    $.get("example.php", {}, function(){}),
    $.get("list.php", {}, function(){}),
    $.get("test.php", {}, function(){}),

]

$.when.apply(null, promises).then( function() {
     jsonarray = []
     $.each(arguments, function(index, value){
         // this is what I would like to work but doesn't
         // promises[index].success.url is how I imagine accessing 
         //"list.php" or "test.php"
         if (jsonarray[promises[index].success.url] == null){
              jsonarray[promises[index].success.url] = []
         }
         jsonarray[promises[index].success.url] = value
         doSomethingWith(jsonarray)
     })

Y at-il une autre façon de faire correspondre chaque argument avec l'appel Ajax qui l'a produit? Ce que je ne veux pas faire est la suivante:

$.when.apply(null, promises).then( function(examplejson, listjson, testjson) {
         // this is lame
         exampledoSomethingWith(examplejson)
         listdoSomethingWith(listjson)
         testdoSomethingWith(testjson)
})

Merci! Sara

Était-ce utile?

La solution

http://jsfiddle.net/6EZsh/2/

$(function() {

    var objs = [{'one':1},{'two':2},{'three':3}];
    var urls = [];

    ajaxCall = function(i) {
        return $.ajax({
            url:'/echo/html/',
            method: 'POST',
            data: {id:i}
        }).done(function () {
            urls.push({obj:i,url:this.url});
        });   
    }

   $.when.apply($,
        objs.map(function(i) {
            return ajaxCall(i);
        })
    ).then(
        console.log(urls)
    );

});

Comme mentionné l'objet que vous recevez dans votre « puis » sont les gestionnaires de succès pour tous vos deferreds. La seule vraie façon de jumeler ces informations serait dans le gestionnaire de succès de vos appels Ajax. Exemple ci-dessus.

Autres conseils

L'essai de laisser

var urls = [
    "example.php",
    "list.php",
    "test.php"
];
var promises = [  
];

var jsonarray = {};
$.each(urls, function(index, value) {
    promises[index] = $.get(urls[index], {}, function(){});
    promises[index].success(function(data) {
        jsonarray[urls[index]] = data; //is this the value you want in the jsonarray??
    });
});

$.when.apply(null, promises).then( function() {
    doSomethingWith(jsonarray) 
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top