2

私は理解できない奇妙な行動をしています。コードは次のとおりです。

$.ajax({
    url: ...,
    dataType: ...,
       data: ...,
    success: function( data ) {
            ...

            for (var i=0; i<data.length; i++) {

                label_to_change = "some-" + i + "-item"

                        $.ajax({
                            url: ...,
                            dataType: ...,
                               data: ...,
                            success: function( data ) {

                                // Why I can't access the value in each loop, this will give me allways the last loop value
                                console.log(label_to_change)
                            }
                        }); 
            } 
    }
}); 

2番目のajaxリクエストでvarlabel_to_changeにアクセスする必要がありますが、これを取得する代わりに:

some-0-item
some-1-item
some-2-item

私はこれを得た:

some-2-item
some-2-item
some-2-item

私が間違っていることについての手がかりはありますか?

よろしくお願いします、

4

3 に答える 3

5

問題は、label_to_change変数が単一のインスタンスであり、forループがajax呼び出しが完了する前に変数を3回変更しているためです。匿名関数(またはここでの正しい用語は何でも)を使用して、次のようなことを行うことができます。

label_to_change = "some-" + i + "-item";

(function(newLabel){
    $.ajax({
       url: ...,
       dataType: ...,
       data: ...,
       success: function( data ) {
          console.log(newLabel)
       }
    }); 
})(label_to_change);
于 2013-01-10T16:29:12.343 に答える
0

更新 これを行う必要があります:(コードの上部)

var change_index=0;

2番目のajax呼び出しで:

complete : function(){
   change_index++;
}

ここは :

   var change_index=0;
  var i=0;
    $.ajax({
        url: ...,
        dataType: ...,
           data: ...,
        success: function( data ) {
                ...

               while( i<data.length) {

                    label_to_change = "some-" + change_index + "-item"

                            $.ajax({
                                url: ...,
                                dataType: ...,
                                   data: ...,
                                success: function( data ) {


                                    console.log(label_to_change)
                                }
                complete:function(){
                                    change_index ++;
                 i++;
                }
                            }); 
                } 
        }
    });

ajaxの終了時間はサーバーページの実行に関連しており、forステートメントはサーバーステートメントよりもはるかに高速に実行されるためです。そのため、 label_to_changeが 2 に設定され、おそらく ajax 呼び出しがまだ終了していません。したがって 、forloop本体ではなく、ajaxの完全なイベント関数でlabel_to_changeを増やす必要があります。

于 2013-01-10T16:30:47.647 に答える
0

これは、for ループが完了した後に ajax 呼び出しが成功するためです。したがって、使用している値は最新のものにすぎません。

成功関数内で label_to_change 変数を宣言すると機能するはずです。これを試して:

for (var i=0; i<data.length; i++) {
    //EDIT: added
    var iCurrent = i;

    $.ajax({
        url: ...,
        dataType: ...,
        data: ...,
        success: function( data ) {
            //placing the declaration inside this function will make the i value
            // be specific to this ajax call

            label_to_change = "some-" + iCurrent + "-item";

            console.log(label_to_change)
        }
    }); 
 } 
于 2013-01-10T16:36:14.810 に答える