我正在尝试从API异步加载一堆数据,并且在加载所有数据时,我想触发一个事件,即所有数据都已加载。我遇到的问题是我使用的API将响应对象的数量限制为五个。我可能需要检索30-40个响应对象。
因此,我想做的是创建一个when-
then语句,该语句循环遍历数据项并每5个请求一次,然后在所有项加载完毕后触发一个已加载事件。我遇到的问题是,当ajax请求成功之前,when-
then语句已完成。
到我尝试过的代码上。
function loadsLotsOfStats(stats, dataType, eventName, dataName, callback) {
var groupedStats = [];
while (stats.length > 0) {
groupedStats.push(stats.splice(0, 5).join('/'));
}
j$.when(
groupedStats.forEach(function (d) {
loadJSONToData(model.apiUrl.replace("{IDS}", d), "json", "", dataName, function (d) { /*console.log(d);*/ }, true)
})
).then(function () {
j$(eventSource).trigger('dataLoaded', eventName);
});
loadJSONToData函数基本上只是异步$ .ajax的包装函数。
所以是的,在实际加载数据之前就触发了该事件。同样由于某种原因,如果我尝试在when()中通过语法错误声明for循环?
有谁对我如何提出一堆Ajax请求有任何建议,然后等到它们全部完成后再触发事件?还是想解决我目前拥有的东西?
在此先感谢您的帮助。
可以按照您的要求进行操作。但是,您将请求发送到的服务器可能有一个原因限制了它们。作为从事Web开发工作并亲眼目睹DDOS,抓取以及其他滥用API的人,我建议遵循其限制。
话虽如此,这是您可以做到的。
$ .ajax实际上返回一个延迟的对象,因此您可以利用该对象。$ .when还可以接受任意数量的延迟对象。结合这两个事实可以解决您的问题。
var deferreds = [];
$.each(groupedStats, function(index, stat){
deferreds.push(
// No success handler - don't want to trigger the deferred object
$.ajax({
url: '/some/url',
data: {stat: stat},
type: 'POST'
})
);
});
// Can't pass a literal array, so use apply.
$.when.apply($, deferreds).then(function(){
// Do your success stuff
}).fail(function(){
// Probably want to catch failure
}).always(function(){
// Or use always if you want to do the same thing
// whether the call succeeds or fails
});
请注意,这不是竞争条件。尽管$ .ajax是异步的,但$ .each不是异步的,因此您的递延列表将是到达$ .when之前的总列表,并且$ .then /
$。fail / $。always仅在它们全部完成后才被触发。
编辑:我忘了添加5s拆分,但这说明了总体思路。您可能可以从这里弄清楚如何将其应用于您的问题。顺便说一句,您可以只使用array.splice(0,5)从数组中获取下5个结果。.splice是可以安全使用的;如果元素总数少于5,则仅获取所有剩余元素。
问题内容: 此js循环脚本始终会在jquery ajax函数中获取ui_item的最后一个值。如何捕获每次迭代的正确值? 谢谢! 问题答案: 问题在于匿名回调方法通过引用捕获变量。由于只有一个变量,因此它总是会得到最后分配给该变量的任何内容。 您需要将循环的内容包装在作为参数的函数中,然后在循环中调用该函数。每次对包装函数的调用都会创建一个单独的变量,以解决问题。 例如:
我的Flutter项目中有一个Dart枚举,如下所示: 如果我有一些随机枚举状态,如,我如何迭代到下一个枚举(而不需要做一些事情,如用开关语句映射它们)? 我在这个,这个和这个的帮助下找到了答案,所以我把它贴在下面。
问题内容: 我需要遍历一个post数组并对其求和。 但是我不知道从哪里开始。 问题答案: 这是您的操作方式: 这会照顾传入的变量和数组。
问题内容: 我有该代码: 它可以很好地上传图像,但是问题是我找不到一种逐一上传图像的方法,我试图将 async 选项 设置为false, 但是它冻结了网络浏览器,直到所有图像都被上传为止,这不是我所需要的。想要,我想以某种方式模拟此 “ async:false” 选项以执行相同的操作,但不冻结Web浏览器。 这该怎么做 ? 问题答案: 您可以创建一个Promise数组,以便在所有Promise都解
问题内容: 我使用jQuery发送AJAX请求,从服务器检索数据。 然后将该数据附加到元素。这应该发生5次,但总是会随机发生3、4或5次。基本上,循环有时会跳过AJAX请求,但大多数情况下都会捕获该请求。如何确保每次完成五次请求?以及跳过AJAX请求的这种随机行为的背后原因是什么?(旁注。我已经检查了请求错误,但从未警告到请求失败) 这是我的JS: ps这发生在按下按钮时。 问题答案: 不要同步进
问题内容: 您好,我正在尝试创建一个遍历链表的for循环。对于每条数据,它将单独列出。我正在尝试在此处学习链接列表,因此请不要提供数组建议。有人知道怎么做吗? 示例输出: 187号航班 501航班 我的代码如下: 问题答案: 只需使用增强的for循环,就像使用数组一样: