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)
                            }
                        }); 
            } 
    }
}); 

我需要在第二个 ajax 请求中访问 var label_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;

在第二个 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 调用还没有完成。所以你应该在 ajax 的完整事件函数中增加label_to_change 而不是在 forloop 主体中。

于 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 回答