2012-02-05 40 views
1

这可能非常简单,也可能非常复杂我不确定此时。jQuery - 连接未知数量的Ajax请求的结果

我正在写一个小型的网络应用程序,它会根据Cineworld API做电影调度。

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

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

您可以在这里看到该应用程序的当前,很早,状态:http://www.lewishowles.co.uk/film/

和主要的胆量是在这个文件:http://www.lewishowles.co.uk/film/js/lh.js

线42206是我的问题。 42总是记录一个空数组,但是如果我每次将数组记录为206,那就没问题。虽然记录显然不会帮助我很多。它看起来像42上的日志没有等待它上面的函数中的所有代码完成。

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

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

将async设置为false会阻止它们彼此跳动,但这不能帮助这种情况。

我能想到的两件事是使用会话存储或隐藏HTML中每个循环的结果,然后稍后我必须访问它们,但这两者看起来似乎都会出现相同的问题。

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

任何想法?

回答

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); 
      } 
     }) 
    } 
} 
+0

就这么简单。我显然已经盯着它太久了!非常感谢。 – 2012-02-05 14:27:42

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