2013-05-10 5 views
0

Я пытаюсь запустить следующую схему: у меня есть вызов 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); 
     }); 
    } 

ответ

0

Я в конечном итоге решить проблему с помощью deferreds так:

function main(){ 
     var promises = []; 
     return data.getItems() 
        .then(succeeded) 
        .then(function() { 
         var deferred = Q.defer(); 
         Q.all(promises).done(function() { 

          logger.logError("Done"); 
          return deferred.resolve(true); 
         }); 
         return deferred.promise; 
        }) 
        .fail(failed); 
     } 
    } 
function succeeded(d) { 
    promises = []; 
    d.results.forEach(function (i) { 
     promises.push([getCounts(i), getLastSubItem(i)]); 
    }); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^