2010-12-05 23 views
0

私はURLの配列をループしています。それぞれが別のドメインからいくつかのjsonpデータを取得します。成功ハンドラは、元のループ内のデータにアクセスできる必要がありますが、コールバックから呼び出されたときは、常に最後の値であり、ajax関数の呼び出し時に設定された値ではありません。この値をコールバックにアクセスまたは渡すにはどうすればよいですか?コールバック内からクロージャ変数にアクセスする方法

for(var site in data.sites){ 
    var domain = data.sites[site].domain; 
    $('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.'); 
    $.getJSON(url, function(data){ 
     if(data.success == true) 
      $("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.'); 
     else 
      $("#" + site.domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.'); 
    }); 
} 

答えて

5
forループにはブロックスコープがありませんJavaScriptでは

は、domain変数はすべてのループのために共有され、あなたがクローズ}後にそれにアクセスすることができ、たとえば(厳密にはループ内で、親関数のスコープですfor()の場合、それは最後のループで持っていた値になります)。

これを解決するには、独自の変数を使用してスコープを追加する必要があります。 $.each()を使用すると、この場合の最も簡単です:

$.each(data.sites, function(i, site){ 
    var domain = site.domain; 
    $('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.'); 
    $.getJSON(url, function(data){ 
    if(data.success == true) 
     $("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.'); 
    else 
     $("#" + domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.'); 
    }); 
}); 

forループ方法は次のようになります:

for(var site in data.sites){ 
    (function(domain) { 
    $('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.'); 
    $.getJSON(url, function(data){ 
     if(data.success == true) 
      $("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.'); 
     else 
      $("#" + domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.'); 
    }); 
    })(data.sites[site].domain); 
} 
関連する問題