0

我必须包含 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 并在完成后返回所有内容?

4

2 回答 2

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);
    });
});
于 2013-07-30T14:00:04.977 回答
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);
        }
    });
};
于 2013-07-30T13:52:24.533 回答