-1

在我正在编写的 chrome 扩展中,我需要针对我的服务器验证我存储在 localStorage 中的一些对象。为此,我创建了一个 for 循环,它只为每个 localstorage 元素发送数据,并且需要对响应做一些事情。代码是这样的:

 for (var key in localStorage) {
        if (! some condition )
                      continue;

        var httpRequest = new XMLHttpRequest();
        httpRequest.onreadystatechange = function() {
            if (httpRequest.readyState === 4 && httpRequest.response == 200) {
                do something with 'key' from the for loop
            }
        }
        };
        var url = BASE_PATH ;
        httpRequest.open("POST", url);
        httpRequest.send(some data);
                     }

然而,在调试时,似乎在 ajax 响应中,for 循环中的“键”不是我需要的键:我期望从匹配每个 ajax 调用的 for 循环中获得相同的键,我得到的是所有 ajax 调用的相同键。我是在做错事还是期待不可能的事情?我认为,因为 ajax 是在一个闭包函数中,所以值会保存在内存中或类似的东西中。

4

1 回答 1

1

将实际的 Ajax 调用提取到一个单独的函数:

function AjaxCall( key ) {
  var httpRequest = new XMLHttpRequest();
  httpRequest.onreadystatechange = function() {
    if ((httpRequest.readyState === 4) && (httpRequest.response == 200)) {
      do something with 'key' from the for loop
    }
  };
  var url = BASE_PATH ;
  httpRequest.open("POST", url);
  httpRequest.send(some data);
}

for (var key in localStorage) {
  if ( some condition ) {    
    AjaxCall( key );
  }    
}

原因是,您正在使用传递给的函数创建一个闭包onreadystatechange。所有这些函数都指向同一个key变量,在循环结束后,该变量只保存所有 Ajax 调用的一个(最后一个)值。

当您创建一个单独的函数(如AjaxCall()我的示例中的)时,您为每个调用创建不同的上下文,因此所有回调都指向不同的键。

于 2013-05-14T14:50:07.540 回答