2

同じ問題に対処する他の質問があることは承知していますが、適切に理解できる答えが見つかりません。

ページ名の配列をループしてページの配列を読み込もうとしています。次に、jQuery の $.get 関数を使用してページのコンテンツを取得します。ループの最後のコールバックのみが発生するのは、ループ クロージャーによるものだと思います。しかし、これを回避する方法や修正方法がわかりません。誰か説明してもらえますか?

コードは次のとおりです。

function checkall2()
{
    i = 0;
    for(i in $servers) {
        $.get("servers/" + $servers[i], function(result) {
            alert(result + $servers[i]);
        });
    }
}
4

5 に答える 5

4

これはスコープの問題iです。「上書き」され、最終的にコールバックがトリガーされると、その値はすべてのコールバックで同じになります。

jQueryを使用しているため、代わりにイテレータを使用できます。

$.each($servers, function(i, server) {
  $.get("servers/" + server, function(result) {
    alert(result + server);
  });
});

私見、それははるかに明確に見えます。

于 2012-08-05T13:58:36.323 に答える
3

これはスコープの問題だと思います-次のように、ループ内でローカルに割り当ててみてください:

function checkall2()
{
    i = 0;
    for(i in $servers) {
        var server = $servers[i];
        $.get("servers/" + server, function(result) {
            alert(result + server);
        });
    }
}

動作するように編集$.each- > http://api.jquery.com/jQuery.each/

function checkall2()
{
    $.each($servers, function(index, server) {
        $.get("servers/" + server, function(result) {
            alert(result + server);
        });
    });
}
于 2012-08-05T13:52:20.040 に答える
0

ループ内で async メソッドを呼び出すことはできません。代わりに次のようにします。

function checkall2(i)
{
    if(i< $servers.length) {
        $.get("servers/" + $servers[i], function(result) {
            alert(result + $servers[i]);
           checkall2(++i);
        });
    }
}
于 2012-08-05T13:54:41.867 に答える
0
var $servers = [1,2,3];
function checkall2()
{
    i = 0;
    for(i in $servers) {
       $.get("servers/" + $servers[i], function(result) {
         alert(result + $servers[i]);
      });
    }
 }
 checkall2();

これは私のマシンでは問題なく動作します。あなたのグローバル変数は大丈夫ですか?

于 2012-08-05T13:55:12.413 に答える
0

わかりました、なぜそれが機能しなかったのかがわかりました。問題を説明してくれたペドロに感謝します。そのため、変数の結果は毎回異なりましたが、それは問題ありませんでした.3つのファイルすべての内容が同じであったため、それらを変更すると、結果が異なることに気付きました.

$servers[i] が毎回同じ値を返す理由は、ループがコールバックを終了すると呼び出され、その時までにループの最後にいたため、$servers[2] が返されたためです。 3 回 (2 はループの終わりだったので)。

于 2012-08-05T14:18:24.230 に答える