jQuery ajax循环和迭代范围

jQuery ajax loop and iteration scope

本文关键字:迭代 范围 循环 ajax jQuery      更新时间:2024-02-03

我想知道为什么在下面的代码中,I变量仍然显示"5",而不是显示"1"然后显示2"然后"3"等等?这肯定是一个范围问题,但我并没有真正理解,因为我在全局和dom范围中更改了I变量的范围,但仍然遇到同样的问题。当我在ajax函数外提醒I时,它工作得很好。

for (var i = 0; i < 5; i++) {   
   $.ajax({
        url: '/echo/html/',
        method:'post',
        data: {
            html: 'Ajax data'
        },
        success: function (resp) {
            $('#success').append(i) // always 5
        }
    })
    $('#outsideAjax').append(i); // is okay
}

这是小提琴

编辑:

我选择了@Tushar Gupta解决方案,因为它最适合我的需求,但我遇到了另一个问题,如果我设置此选项,迭代将不起作用:processData:false

查看小提琴

为什么不起作用?

这是由于JavaScript中的闭包。这是修复-

for (var i = 0; i < 5; i++) { 
   (function(i){
    $.ajax({
        url: '/echo/html/',
        method:'post',
        data: {
            html: 'Ajax data'
        },
        success: function (resp) {
            $('#success').append(i) 
        }
    })
    })(i);
    $('#outsideAjax').append(i); 
}

您可以使用闭包来修复此问题,包装i:的值

for (var i = 0; i < 5; i++) {   
   (function(val){
      $.ajax({
          url: '/echo/html/',
          method:'post',
           data: {
               html: 'Ajax data'
           },
           success: function (resp) {
               $('#success').append(val);
           }
       })
       $('#outsideAjax').append(val); // is okay
     })(i);
}

fiddle Demo

var i = 0;
function ajax_call() {
    $.ajax({
        url: '/echo/html/',
        method: 'post',
        data: {
            html: 'Ajax data'
        },
        success: function (resp) {
            $('#success').append(i++);
            if (i < 5) {
                ajax_call();
            }
        }
    });
    $('#outsideAjax').append(i);
};
ajax_call();

使用Function#bind()的解决方案:
http://jsfiddle.net/RQncd/1/

for (var i = 0; i < 5; i++) {   
  $.ajax({
    url: '/echo/html/',
    method:'post',
    data: {
      html: 'Ajax data'
    },
    success: (function (i, resp) {
      $('#success').append(i);
    }).bind(null, i)
  });
  $('#outsideAjax').append(i);
}