2011-05-03 65 views
6

我在一個循環內做了幾個jQuery ajax調用。每次有一個ajax調用返回時,我需要引用一個對應於原始ajax調用的值。我目前的代碼無法正常工作,因爲lskey變量的值已被進一步的循環迭代所改變。jQuery Ajax調用循環丟失本地變量引用

下面是代碼:

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的正確值?

回答

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

這應該有效。

+0

非常有用,非常感謝... – 2014-02-06 09:16:21

+0

我在谷歌和BAM上寫了一個狡猾的奇怪搜索查詢!第一個結果是你的答案,非常感謝!和所以規則! – NaturalBornCamper 2015-03-01 04:24:31

+0

解釋爲什麼這項工作會有所幫助。 – dshgna 2016-02-19 08:08:30

0

您是否考慮鏈接AJAX調用?基本上你可以做一個AJAX調用,處理結果,修改lskey等。然後當你準備好時,增加i併發出第二個AJAX調用。循環這種方式,而不是使用for循環...

+0

謝謝。我想我可以這樣做,但只是想知道是否有某種方法可以將價值「傳遞」到成功功能。 – Journeyman 2011-05-03 14:40:24

1

最後,我將密鑰信息添加到服務器發佈,然後從服務器以JSON格式返回它,以便成功函數然後可以簡單地引用密鑰包含在服務器響應中。

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

請舉例嗎? – 2016-11-25 21:01:15

+0

@MattPowell公平的請求 - 添加了示例。 – 2016-11-26 15:49:49

+0

非常感謝! – 2016-12-05 01:58:17