jQuery - 连接未知数量的Ajax请求的结果

时间:2012-02-05 03:37:36

标签: jquery ajax jquery-deferred deferred

这可能非常简单或非常复杂,我现在还不确定。

我正在编写一个基于Cineworld API执行影院时间表的小型网络应用程序。

我正在使用AJAX撤回数据,这很好,但我已经达到了我想要所有选定的电影的所有时间,然后继续操纵它们,但结合所有结果证明有点问题。

生成的API调用只能在一部电影上完成,因此我必须依次撤回每部电影的数据。

您可以在此处查看应用的当前状态:http://www.lewishowles.co.uk/film/

主要内容在此文件中:http://www.lewishowles.co.uk/film/js/lh.js

42206是我的问题。 42总是记录一个空数组,但如果我每次都按206记录数组,那就没关系了。记录显然不会对我有多大帮助。看起来42上的登录不等待上面函数中的所有代码完成。

正如你所看到的,我已经尝试了一个全局数组,我已经尝试了返回值,但它似乎仍然在运行日志太快。

延迟似乎通常是这种情况,但每次都会有不同数量的ajax调用,看起来你需要知道有多少使用Deferred。

将async设置为false会阻止它们相互绊倒,但这并没有帮助这种情况。

我能想到的两件事是使用会话存储或将HTML中每个循环的结果隐藏在某个地方我以后必须访问的地方,但这两个似乎都会出现同样的问题。< / p>

另一个想法是按下另一个按钮,以便数据有时间加载,但这会增加另一个步骤并且不理想。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果你想发起一些ajax调用,然后知道他们什么时候完成了,那么有很多方法可以做到。

最简单的方法就是保留一个ajax呼叫在飞行中的计数器。然后,当每个完成时,您递减计数器(在成功处理程序中),如果计数器变为零,则在所有数据都可用时调用要执行的函数。

在伪代码中,对于异步ajax调用,它可以像这样工作:

function runAjaxRequests(listOfRequests) {
    var ajaxCntr = listOfRequests.length;
    var ajaxResults = [];

    // fire off all the ajax requests
    for (var i = 0; i < listOfRequests.length; i++) {
        $.ajax(..., function(data) {
            // ajax success handler

            // store data returned from this request into ajaxResults
            ajaxResults.push(...);

            // see if all ajax requests are now done
            --ajaxCntr;
            if (ajaxCntr == 0) {
                // all data has been returned, we can process it now
                processAllAjaxData(ajaxResults);
            }
        })
    }
}

答案 1 :(得分:0)

我有一个类似的用例。我通过制作async:false并将每个结果附加到父变量来实现它。请查看以下代码。

            fileArr = ['1.csv', '2.csv']
            var csvObjArr = []
            for (var i in fileArr) {
                $.ajax({
                    type : "GET",
                    url : _default_base_dir + fileArr[i],
                    dataType : "text",
                    async: false,
                    success : function(data) {
                        // Appending every results in csvObjArr
                        csvObjArr = csvObjArr.concat($.csv.toObjects(data));
                    }
                }); 
            }
            //At this point all ajax are completed
            processData(csvObjArr)

警告此代码将依次进行ajax调用。你需要考虑它,因为它可能减慢不必要的东西。 HTH