Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在jquerywhen-Then-statment中循环Ajax请求?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 如何在jquerywhen-Then-statment中循环Ajax请求?

Javascript 如何在jquerywhen-Then-statment中循环Ajax请求?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我试图从API异步加载一组数据,当加载所有数据时,我想触发一个事件,加载所有数据。我遇到的问题是,我使用的API将响应对象的数量限制为五个。我可能需要检索30-40个响应对象 所以我要做的是创建一个when-then语句,该语句循环遍历数据项,每五个项发出一个请求,然后在加载所有项时,我要触发一个加载的事件。我遇到的问题是when-then语句在ajax请求成功之前完成 我尝试过的代码 function loadsLotsOfStats(stats, dataType, eventName,

我试图从API异步加载一组数据,当加载所有数据时,我想触发一个事件,加载所有数据。我遇到的问题是,我使用的API将响应对象的数量限制为五个。我可能需要检索30-40个响应对象

所以我要做的是创建一个when-then语句,该语句循环遍历数据项,每五个项发出一个请求,然后在加载所有项时,我要触发一个加载的事件。我遇到的问题是when-then语句在ajax请求成功之前完成

我尝试过的代码

 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的包装函数

因此,是的,事件在数据实际加载之前被触发。出于某种原因,如果我试图将for循环放在when(when)语句中,是否会出现语法错误

有人对我如何发出一堆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/$之前的总列表。只有在它们全部完成后才会触发


编辑:我忘了添加5s分割,但这说明了总体思路。您可能可以从这里了解如何将其应用于您的问题。顺便说一句,您可以使用array.splice(0,5)若要从数组中获取下5个结果,.splice可以安全使用;如果元素总数小于5,它将只获取所有剩余元素。

您也可以使用
if(condition.length<10){//code to execute}
。可能会重复竖起大拇指,这完全符合我的需要。回答很好,解释也很好。感谢您的时间。是的,我会研究访问我需要的数据的不同方式,因为您的权利限制是有原因的。解释很好!效果很好。如果我错过了它,我很抱歉,但是您如何抓住和删除它计算响应then函数参数将包括集体响应。对于第一篇ajax帖子,always()只调用一次。如何捕获循环中的所有调用方何时完成,无论是否成功?