Domanda

Sto lavorando con più chiamate Ajax differite e vorrei essere dinamico su come accedo ai loro dati. Invece di codifica hard in diversi parametri nella callback. Quindi usi ciascuno individualmente, vorrei passare attraverso l'oggetto argomenti per accedere ai dati. Funziona bene, tranne per il fatto che non sono in grado di determinare dal JSON quali dati provengono da cui chiama l'Ajax. Potrei risolvere questo o determinando l'URL dall'oggetto Promise (in qualche modo) o capito quale ordine le chiamate Ajax eseguite e supponendo che i dati siano nello stesso ordine.

Ecco il mio codice finora (deriso per illustrare quello che sto cercando di fare):

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)
     })

C'è un altro modo per abbinare ogni argomento con la chiamata Ajax che l'ha prodotta? Quello che non voglio fare è questo:

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

Grazie! Sara

È stato utile?

Soluzione

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)
    );

});

Come accennato, l'oggetto che ricevi nei tuoi "allora" sono i gestori di successo per tutti i tuoi differiti. Quindi l'unico vero modo per accoppiare queste informazioni sarebbe nel gestore di successo delle tue chiamate Ajax. Esempio sopra.

Altri suggerimenti

proviamo

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) 
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top