1

这可能非常简单,也可能非常复杂,我目前不确定。

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

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

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

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

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

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

如您所见,我尝试了一个全局数组,我尝试了返回值,但它似乎仍然太快地运行日志。

Deferred 似乎通常是这种情况,但是每次都会有不同数量的 ajax 调用,并且您似乎需要知道使用 Deferred 的数量。

将 async 设置为 false 可以阻止它们相互绊倒,但这无助于这种情况。

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

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

有任何想法吗?

4

2 回答 2

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);
            }
        })
    }
}
于 2012-02-05T04:14:46.073 回答
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调用一个接一个。您需要考虑到它,因为它可能会减慢不必要的速度。高温高压

于 2016-02-06T05:45:38.123 回答