2013-05-10 26 views
0

我試圖讓下面的方案工作:我有一個ajax調用返回一個對象數組(承諾)。 現在,我有一個成功的函數,對數組中的每個項目進行額外處理,包括進行其他異步Ajax調用。當然,這會導致頭痛,因爲主函數success()在子函數完成之前返回,這不是我想要的。每個子函數調用也返回一個promise,並且我只想在所有項加載時才離開main函數。在陣列上的jQuery異步調用

這是我到目前爲止嘗試過的。主函數getItemData不會等待Q.all(...)返回。 我使用的JS AsyncQ.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)]); 
    }); 
}