1

ループ内でAjax関数を実行しようとしていますが、ajax呼び出しが終了したときにのみループを次の命令に移動させたいと考えています。ajax asyncを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を参照してください。

于 2012-11-01T13:52:04.503 に答える