Я искал много очень похожих вопросов. Я нашел тот, у которого было почти то, что я искал, за исключением того, что у него не было обработки ошибок, и при попытке реализовать обработку ошибок я сталкиваюсь с некоторыми проблемами.
Моя цель - создать функцию, которая получает массив имен, создает запросы $ .ajax в цикле, нажимая объекты с обещаниями на возврат в массив, который затем я предоставляю в $ .when.apply ($, arrayOfPromises). . затем (// и т.д., чтобы разрешить мастеру отложенное где все обещания в arrayOfPromises были решены Конечным результатом является то, чтобы создать массив данных, возвращаемых из Аякса вызовов
меня это до сих пор:. http://jsfiddle.net/BGx2h/1/
Это почти то, что мне нужно. Если массив содержит указатели на все допустимые ресурсы, все работает так, как планировалось. Однако, если есть вызов ресурса, он не существует (s uch как /test/doesnt.exist.txt в моей скрипке), вызов ajax для «doesnt.exist» заканчивается перед любым другим вызовом, мастер отложен (connectiondfd) получает разрешение до того, как другие вызовы имеют шанс закончить (вам может понадобиться запустить скрипку несколько раз, чтобы получить этот результат). Вот то, что моя функция выглядит в настоящее время:
function multiAsync() {
var i,data=[],connections=[],
targets=['John.Smith','Jane.Doe','Bob.Someone','doesnt.exist'];
var connectiondfd = $.Deferred();
for(i=0;i<targets.length;i++) {
connections.push($.ajax({
url:'http://porticium.ca/test/'+targets[i]+'.txt',
type:'GET',
async:true,
timeout:5000
}).then(function(newData) {
data.push(newData);
},function() {
data.push("NO DATA");
}));
}
$.when.apply($,connections)
.then(
function() { connectiondfd.resolve(); },
function() { connectiondfd.resolve(); }
);
$.when(connectiondfd).done(function() {
alert("FINAL: " + data);
});
}
бы определенно оценить некоторую помощь на этом, это было сводит меня с ума!
Спасибо, Роб
с обработкой ошибок, в момент одна из обещаний терпит неудачу, вы получите сбой обработчика и никогда не получите успеха. Так как ваше неудачное обещание заканчивается почти мгновенно, оно всегда будет показывать неудачу до конца. Если это не функциональность, которую вы хотите, вы можете рассмотреть возможность использования чего-то другого, кроме отложенных объектов, например объекта $ .Callbacks. –
Спасибо за ваш быстрый ответ. Сейчас я просматриваю $ .Callbacks. Таким образом, по существу нет способа сказать $ .when.apply ($, listOfPromises) .whenALLPromisesHaveResolvedOrRejected (function() {}); таким образом, и я не просто что-то упустил? – robgood
правильный. как только один проваливается, это происходит в ожидании. –