Я пытаюсь запустить следующую схему: у меня есть вызов ajax, который возвращает массив объектов (обещание). Теперь у меня есть функция, которая выполняет дополнительную обработку для каждого элемента массива, включая выполнение других асинхронных вызовов async. Конечно, это создает головную боль, потому что главная функция successed() возвращается до того, как выполняются подфункции, чего я не хочу. Каждый вызов подфункции также возвращает обещание, и я хочу оставить основную функцию только при загрузке всех элементов.jQuery async вызывает массив
Вот что я пробовал до сих пор. Основная функция getItemData не ждет возврата Q.all (...). Я использую JS Async и Q.js библиотеки:
function main() {
//performs an ajax get to grab items from server
return data.getItems().then(succeeded).fail(failed);
}
function succeeded(d) {
async.each(d.results, getItemData, function (err) { logger.logError(err) });
function getItemData(item, callback) {
//counts
item.totalSubItems = ko.observable(0);
Q.all([getCounts, getLastSubItem]).then(function fulfilled() {
items.push(item);
return callback;
});
};
function getCounts() {
//another ajax call that returns a promise
data.getItemCounts(item.id()).then(function (c) {
var results = c.results;
//some work
})
.fail(function (error) {
logger.logError(error);
});
function getLastSubItem() {
//also returns a promise
data.getLastSubItem(item.id()).then(function (sub) {
item.lastsub(sub.results[0]);
})
.fail(function (error) {
logger.logError(error);
});
}