如何延迟for循环

时间:2013-04-11 07:41:28

标签: javascript jquery ajax internet-explorer

我想将请求延迟几毫秒。

我在for循环中做了3个ajax调用jquery,for循环的长度是20个。

意味着我在几秒钟内做了近60个请求。在chrome,firefox,safary和opera中它没有问题,但在IE中它中止了请求。

My For Loop

for (index in personScoreCollection.collection) {
        //Get the 4th and 5th score simultaniously.
        $.when(UserSearch(index), UsabilityScore(index), UserConnection(index)).done();
    }

所有方法都有一个ajax请求。

你可以看到错误如何在这里中止请求

image http://s24.postimg.org/q0zj3vwhg/Error_Message.jpg

如何使用java脚本延迟或保留请求。

2 个答案:

答案 0 :(得分:1)

您应该使用.done调用本身来触发下一批AJAX调用:

var keys = Object.keys(personScoreCollection.collection);

(function next() {
    if (keys.length) {
       var index = keys.shift();
       $.when(UserSearch(index),
              UsabilityScore(index),
              UserConnection(index)
       ).done(function(a, b, c) {
                  // process results
       }, next);  // recurse
    }
})();  // start loop immediately

代码生成所需键的数组,并且一次只从该数组中移出一个键,然后进行三个必需的AJAX调用。只有当三者都完成后才开始下一批。

要循环,它利用了.done如何传递多个回调的方式,每个回调都将被调用。如果您要反转这两个回调,实际上可以在处理当前结果集时启动下一批(异步)提取。

请注意,如果任何AJAX调用失败,则此循环将中止,因为不会调用.done函数的回调。

答案 1 :(得分:0)

您可以使用setTimeout函数来延迟某些工作。 一个例子:

var ms_pause = 50; // time between request in milliseconds
var counter = 1;

for (index in personScoreCollection.collection) {
    //Get the 4th and 5th score simultaniously.
    setTimeout((function(context_index){
        return function(){
            $.when(UserSearch(context_index), UsabilityScore(context_index), UserConnection(context_index)).done();
        }
    })(index), ms_pause * counter);
    counter += 1;
}