$ .each迭代之间暂停5秒

时间:2015-02-24 14:35:04

标签: javascript jquery ajax loops

我相信我通过在短时间内拨打太多电话来超时网络服务。我希望在我的jquery中$.each循环的每次迭代之间等待大约5秒钟。

以下是我的观点:

function submitMyList(myList) {
    $.each(JSON.parse(myList), function (key, value) {
        setTimeout( function(){ 
            $.ajax({
                type: 'POST',
                url: '@Url.Action("submitMyList", "myController")',
                dataType: 'html',
                contentType: 'application/json; charset=utf-8',
                data: JSON.stringify(//passing my values),
                success: function (result) {
                    //success code
                },
                error: function (result) {
                    //error code
                },
                complete: function () {
                    //completion code
                }

            });
        }, 5000)     
    });
}

这仍然是一个接一个地执行得非常快。

2 个答案:

答案 0 :(得分:2)

当你运行“each”时,你会立即设置很多计时器, all 等待5秒,然后同时运行。 这是因为每个人都希望尽快完成它的循环,并运行它的所有功能(包括“setTimeout”功能)。它不必等待任何事情,所以运行并设置了很多'超时:)

最简单的解决方案是让setTimeout等待5000 * num毫秒,并在每个循环中增加num,如下所示:

function submitMyList(myList) {
  var num = 0;
  $.each(JSON.parse(myList), function (key, value) {
    num++;
    setTimeout( function(){ 
        $.ajax({
            type: 'POST',
            url: '@Url.Action("submitMyList", "myController")',
            dataType: 'html',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(//passing my values),
            success: function (result) {
                //success code
            },
            error: function (result) {
                //error code
            },
            complete: function () {
                //completion code
            }

        });
    }, 5000*num);     
  });
}

答案 1 :(得分:2)

这种方法可行:

$(document).ready(function () {
    var a = new Array("Apples", "Bananas", "Oranges")
    jQuery.each(a, function (idx, val) {
        setTimeout(function() {
            console.log("At "+idx+" Val "+val)
        }, idx * 5000);
    })
})

在你的具体案例中试试这个:

function submitMyList(myList) {
    var idx = 0;
    $.each(JSON.parse(myList), function (key, value) {
        setTimeout( function(){ 
            $.ajax({
                type: 'POST',
                url: '@Url.Action("submitMyList", "myController")',
                dataType: 'html',
                contentType: 'application/json; charset=utf-8',
                data: JSON.stringify(//passing my values),
                success: function (result) {
                    //success code
                },
                error: function (result) {
                    //error code
                },
                complete: function () {
                    //completion code
                }

            });

        }, idx*5000)
        idx++;     
    });
};

示例:http://jsfiddle.net/1w6uxLxs/1/

这个想法 你必须将你的超时乘以迭代次数,因为发生的是超时是一个接一个地设置(基本上同时),因为发生的是循环遍历所有元素和你指示浏览器的每个元素({ {1}})在一定时间后执行一个函数。通过将此时间量乘以索引,您将获得“延迟”效果。看看此示例中控制台中发生的情况:http://jsfiddle.net/1w6uxLxs/2/