jQuery异步调用数组

时间:2013-05-10 07:16:25

标签: jquery promise q

我正在尝试使用以下方案:我有一个ajax调用,它返回一个对象数组(promise)。 现在,我有一个成功的函数,它对数组中的每个项执行额外的处理,包括进行其他异步ajax调用。当然,这会让人头疼,因为主要的successed()函数在子函数完成之前返回,这不是我想要的。每个子函数调用也返回一个promise,我想只在所有项加载时离开main函数。

这是我到目前为止所尝试的内容。主函数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);
        });
    }

1 个答案:

答案 0 :(得分:0)

我最终通过使用这样的延迟来解决问题:

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)]);
    });
}