1

我正在尝试在循环中执行 Ajax 函数,并且我希望我的循环仅在 ajax 调用完成时才转到下一条指令。我试图将 ajax 异步设置为 false,但我的加载消息没有出现,并且当循环的所有迭代完成时我的屏幕刷新。如果 async 设置为 true,它会同时执行。

这是我的代码:

function pingAll( url )
{
    var arrIDs = new Array();
    var pattern = /[0-9]+/g;

    $("input:checkbox[name=checkbox-router]:checked").each(function()
    {
        var strCheckboxID = $(this).attr( 'id' );
        var routerID = strCheckboxID.match( pattern );
        arrIDs.push( routerID );
    });

    for (var i in arrIDs)
    {
        pingRouter(url + arrIDs[i], arrIDs[i]);
    }
}

function pingRouter( url, shortID )
{
    $( '#ping-resp-' + shortID ).html( 'Loading...' );  
    var pingRequestTimeout = $( '#pingRequestTimeout' ).val();      
    url = url + "?timeout=" + pingRequestTimeout;

    $.ajax
    ({
        url: url,
        async: true,
        success: function( data )
        {
            var objData = $.parseJSON( data );
            var response =  objData.response.replace(/(\r\n|\n|\r)/gm,"")
            .
            .
            .
            var latency = parseFloat( objData.latency );
            $( '#ping-resp-' + shortID ).html( latency + ' ms' );
        }
    });
    return;   
}

谢谢你的帮助。

4

1 回答 1

0

您可以按如下方式使用递归:

function pingRouter(baseurl, arrIDs , i) {
    if( i < 0 || i > arrIDs.length - 1) {
        return;
    }
    var url = baseurl + arrIDs[i];
    var shortID = arrIDs[i];

    $( '#ping-resp-' + shortID ).html( 'Loading...' );  
    var pingRequestTimeout = $( '#pingRequestTimeout' ).val();      
    url = url + "?timeout=" + pingRequestTimeout;

    $.ajax
    ({
        url: url,
        async: true,
        success: function( data )
        {
            var objData = $.parseJSON( data );
            var response =  objData.response.replace(/(\r\n|\n|\r)/gm,"")
            .
            .
            .
            var latency = parseFloat( objData.latency );
            $( '#ping-resp-' + shortID ).html( latency + ' ms' );

        }
    }).always(function() {
        if(i < arrIDs.length + 1) {
            pingRouter(baseurl, arrIDs , i + 1);
        }
    });
    return;   

}

并将您的调用函数更改为:

pingRouter(url, arrIDs, 0);

请参阅 API for always

于 2012-11-01T13:52:04.503 回答