这可能非常简单或非常复杂,我现在还不确定。
我正在编写一个基于Cineworld API执行影院时间表的小型网络应用程序。
我正在使用AJAX撤回数据,这很好,但我已经达到了我想要所有选定的电影的所有时间,然后继续操纵它们,但结合所有结果证明有点问题。
生成的API调用只能在一部电影上完成,因此我必须依次撤回每部电影的数据。
您可以在此处查看应用的当前状态:http://www.lewishowles.co.uk/film/
主要内容在此文件中:http://www.lewishowles.co.uk/film/js/lh.js
行42
和206
是我的问题。 42
总是记录一个空数组,但如果我每次都按206
记录数组,那就没关系了。记录显然不会对我有多大帮助。看起来42
上的登录不等待上面函数中的所有代码完成。
正如你所看到的,我已经尝试了一个全局数组,我已经尝试了返回值,但它似乎仍然在运行日志太快。
延迟似乎通常是这种情况,但每次都会有不同数量的ajax调用,看起来你需要知道有多少使用Deferred。
将async设置为false会阻止它们相互绊倒,但这并没有帮助这种情况。
我能想到的两件事是使用会话存储或将HTML中每个循环的结果隐藏在某个地方我以后必须访问的地方,但这两个似乎都会出现同样的问题。< / p>
另一个想法是按下另一个按钮,以便数据有时间加载,但这会增加另一个步骤并且不理想。
有什么想法吗?
答案 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