jQuery循环ajax调用直到完成并返回回调

时间:2013-07-30 13:00:26

标签: jquery ajax callback

我必须包含ajax请求的函数。第一个请求批处理。基于batchId,它继续获取批处理,直到它在存储累积结果的同时返回完成。一旦它返回完成,那么batchRequest应该返回一个包含所有结果的回调。

我不想对此使用setTimeout,因为它在Android WebView中存在一些问题。它应该在上一次完成之后立即进行另一次getBatch检查。

var batchRequest = function(request, callback) {
$.ajax({
    //some ajax request here
    success: function(data) {
    var results = [];

    getBatch(data.batch.id, function(result) {
        results.push(results.item);

        if (result.done) {
        callback(results);
        } else {
        getBatch(result.id);
        }
    });
    }
});
};

var getBatch = function(batchId, callback) {
$.ajax({
    //get using the batchId
    success: function(data) {
    callback(data);
    }
});
};

最初我将getBatch函数嵌套在batchRequest函数中,但我觉得这不是最好的方法。如何让batchRequest循环getBatch并在完成后返回所有内容?

2 个答案:

答案 0 :(得分:1)

你应该可以将它缩短为类似的东西(未经测试):

var getBatch = function (request, callback) {
    var results = [],
        getBatchPart = function (batchId) {
            $.ajax({
                // ajax params
            }).done(function (data) {
                results.push(data.item);

                if (data.done) {
                    callback(results);
                } else {
                    getBatchPart(batchId);
                }
            });
        };

    $.ajax({
        // ajax params
    }).done(function (data) {
        getBatchPart(data.batch.id);
    });
});

答案 1 :(得分:0)

我确实找到了解决问题的方法,让我保留两个功能。如果我将getBatch调用包装在另一个名为getNext的函数中,那么它会在将数据附加到结果变量时链接调用。最后,当它返回它已完成时,它会将其发送给具有综合结果的回调。

var batchRequest = function(request, callback) {
    $.ajax({
        //some ajax request here
        success: function(data) {
            getNext(data.batch.id);
        }
    });

    var results = [];
    function getNext(batchId) {
        getBatch(batchId, function(result) {
            results.push(result.item);
            if (result.done) {
                callback(result);
            } else {
                getNext(result.id);
            }
        });
    };
};

var getBatch = function(batchId, callback) {
    $.ajax({
        //get using the batchId
        success: function(data) {
             callback(data);
        }
    });
};