jQuery Ajax调用循环丢失局部变量引用

时间:2011-05-03 14:33:38

标签: javascript jquery ajax

我在循环中进行了几个jQuery ajax调用。每次ajax调用返回时,我都需要引用与原始ajax调用相对应的值。我当前的代码无法正常工作,因为lskey变量的值已经被进一步的循环迭代所改变。

以下是代码:

for (var i = 0, len = localStorage.length; i < len; i++) {
        var lskey = localStorage.key(i);
        if (lskey.substr(0, 4) === 'form') {
            var postdata = localStorage.getItem(lskey); // Get the form data
            $.ajax({
                type: "POST",
                async: "false",
                url: "/Profile/PostForm",
                data: postdata,
                success: function (data) {
                    $('#rollinginfo').append('<br>' + data + ',key=' + lskey);
                    localStorage.removeItem(lskey); // Remove the relevant localStorage entry
                }
            , error: function (data) { $('#rollinginfo').append('<br />ERR:' + data); }
            });


        }
    } 

问题是每次循环执行时都会更改lskey,因此成功回调没有对调用时存在的lskey值的引用。

如何为每个成功回调引用lskey的正确值?

4 个答案:

答案 0 :(得分:6)

for (var i = 0, len = localStorage.length; i < len; i++) {
    var lskey = localStorage.key(i);
    if (lskey.substr(0, 4) === 'form') {
        var postdata = localStorage.getItem(lskey); // Get the form data
        $.ajax({
            type: "POST",
            async: "false",
            url: "/Profile/PostForm",
            data: postdata,
            local_lskey: lskey
            success: function (data) {
                $('#rollinginfo').append('<br>' + data + ',key=' + lskey);
                localStorage.removeItem(this.local_lskey); // Remove the relevant localStorage entry
            }
        , error: function (data) { $('#rollinginfo').append('<br />ERR:' + data); }
        });
    }
}

这应该有用。

答案 1 :(得分:1)

最后,我将密钥信息添加到服务器发布中,然后以JSON格式从服务器返回,这样成功函数就可以简单地引用服务器响应中包含的密钥。

答案 2 :(得分:0)

您是否考虑过链接AJAX电话?基本上你可以进行一次AJAX调用,处理结果,修改lskey等。然后当你准备好时,增加i并发出第二个AJAX调用。以这种方式循环,而不是使用for循环......

答案 3 :(得分:0)

您可以将ajax调用放入其自己的函数中并传递lskeypostData值。这样localStorage.removeItem(lskey)将引用上下文中的lskey变量函数而不是循环的上下文。

示例

声明函数 -

function postForm(postdata, lskey) {
  $.ajax({
    type: "POST",
    async: "false",
    url: "/Profile/PostForm",
    data: postdata,
    success: function(data) {
      $('#rollinginfo').append('<br>' + data + ',key=' + lskey);
      localStorage.removeItem(lskey); // Remove the relevant localStorage entry
    },
    error: function(data) {
      $('#rollinginfo').append('<br />ERR:' + data);
    }
  });
}

然后你可以从循环中调用你的函数 -

for (var i = 0, len = localStorage.length; i < len; i++) {
  var lskey = localStorage.key(i);
  if (lskey.substr(0, 4) === 'form') {
    var postdata = localStorage.getItem(lskey); // Get the form data
    postForm(postdata, lskey);
  }
}

您也可以在循环之前声明函数(将其赋值给变量),然后在循环中调用它。

var postForm = function(postdata, lskey) {
  $.ajax({
    type: "POST",
    async: "false",
    url: "/Profile/PostForm",
    data: postdata,
    success: function(data) {
      $('#rollinginfo').append('<br>' + data + ',key=' + lskey);
      localStorage.removeItem(lskey); // Remove the relevant localStorage entry
    },
    error: function(data) {
      $('#rollinginfo').append('<br />ERR:' + data);
    }
  });
}
for (var i = 0, len = localStorage.length; i < len; i++) {
  var lskey = localStorage.key(i);
  if (lskey.substr(0, 4) === 'form') {
    var postdata = localStorage.getItem(lskey); // Get the form data
    postForm(postdata, lskey);
  }
}