Abbinamento dei dati da più chiamate AJAX differite con il loro chiamante
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
Soluzione
$(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)
});