Kombinieren Sie Daten aus mehreren aufgeschobenen Ajax -Anrufen mit ihrem Anrufer
Frage
Ich arbeite mit mehreren aufgeschobenen AJAX -Anrufen und möchte dynamisch darüber sein, wie ich auf ihre Daten zugreife. Anstatt in mehreren Parametern in den Rückruf zu hartcodieren und einzeln einzeln zu verwenden, möchte ich das Argumenteobjekt durchlaufen, um auf die Daten zuzugreifen. Dies funktioniert einwandfrei, außer dass ich nicht aus dem JSON bestimmen kann, welche Daten aus dem AJAX rufen. Ich könnte dies entweder durch die Bestimmung der URL aus dem Versprechensobjekt (irgendwie) lösen oder herausfinden, welche Bestellung die ausgeführten Ajax -Aufrufe und die Annahme, dass die Daten in derselben Reihenfolge sind.
Hier ist mein bisheriger Code (verspottet, um zu veranschaulichen, was ich versuche):
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)
})
Gibt es eine andere Möglichkeit, jedes Argument mit dem Ajax Call zu entsprechen, der es produziert hat? Was ich nicht tun möchte, ist Folgendes:
$.when.apply(null, promises).then( function(examplejson, listjson, testjson) {
// this is lame
exampledoSomethingWith(examplejson)
listdoSomethingWith(listjson)
testdoSomethingWith(testjson)
})
Vielen Dank! Sara
Lösung
$(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)
);
});
Wie bereits erwähnt, dass das Objekt, das Sie in Ihrem "dann" erhalten, sind die Erfolgshandler für alle Ihre Aufschiebungen. Die einzige wirkliche Möglichkeit, diese Informationen zu kombinieren, wäre der Erfolgshandler Ihrer Ajax -Anrufe. Beispiel oben.
Andere Tipps
Lass es uns versuchen
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)
});