1

test(3) を呼び出すと、メッセージ 1 でアラートが表示されます。

function test(param) {

    var tt = [ "a", "b", "c" ];
    for ( var i = 0; i < param; i++) {
        if (tt[i] == "b") {
            test(1);
            alert(i);
        }
    }
}

しかし、成功イベントでは正しく機能していません。以下のメソッド test(3) を呼び出すと、リクエストから成功したと見なされます。メッセージ 3 でアラートが表示されます。

function test(param) {

    var tt = [ "a", "b", "c" ];
    for ( var i = 0; i < param; i++) {
        if (tt[i] == "b") {
            Ext.Ajax.request( {
                url : 'test.do',
                method : 'POST',
                success : function(response) {
                    test(1);
                    alert(i);
                }
            });
        }
    }
}
4

2 に答える 2

3

i非同期関数呼び出しの周りにクロージャーを配置する必要があります。これは、 for ループ内にスコープを作成する IIFE を使用することで実現できます。このスコープでは、 の値iが保持されます。

for ( var i = 0; i < param; i++) {
    if (tt[i] == "b") {
        (function(i){
            Ext.Ajax.request( {
                url : 'test.do',
                method : 'POST',
                success : function(response) {
                    test(1);
                    alert(i);
                }
            });
        }(i));
    }
}

iしかし、おそらくデバッグのみを目的としたアラートメッセージのみが必要なようです。したがって、他のすべてがi正常に機能し、コールバック関数 ( success) 内にアクセスする必要が実際にない場合は、追加のスコープも必要ありません。

于 2013-07-01T09:28:24.473 に答える