Пара данных из нескольких вызовов AJAX с его абонентом
Вопрос
Я работаю с несколькими отложенными вызовами Ajax, и я хотел бы быть динамичным в отношении того, как я доступ к их данным. Вместо того, чтобы жестко кодировать в нескольких параметрах в обратный вызов .Then и использование каждого индивидуального, я хотел бы пройти через объект аргументов для доступа к данным. Это работает нормально, за исключением того, что я не могу определить из JSON, какие данные, из которых вызывает Ajax. Я мог бы решить это либо путем определения URL -адреса из объекта Propect (каким -то образом), либо выяснить, какой порядок вызовет AJAX, и предполагая, что данные находятся в том же порядке.
Вот мой код до сих пор (издевался за то, чтобы проиллюстрировать то, что я пытаюсь сделать):
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)
})
Есть ли другой способ сопоставить каждый аргумент с вызовом Ajax, который его произвел? Я не хочу делать:
$.when.apply(null, promises).then( function(examplejson, listjson, testjson) {
// this is lame
exampledoSomethingWith(examplejson)
listdoSomethingWith(listjson)
testdoSomethingWith(testjson)
})
Спасибо! Сара
Решение
$(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)
);
});
Как уже упоминалось, объект, который вы получаете в своем «тогда», являются обработчиками успеха для всех ваших отложенных. Таким образом, единственным реальным способом соединить эту информацию было бы в обработке успеха ваших звонков Ajax. Пример выше.
Другие советы
давай попробуем
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)
});