Ajax内部For循环
Ajax Inside For Loop
在一个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是在一个闭包函数内,值保存在内存或类似的东西。
提取实际的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()
)时,您为每个调用创建不同的上下文,因此所有回调都指向不同的键。
相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- 我没有'I don’我不理解for在循环中的用途
- 为什么在 Javascript 中使用空的 for 循环 - for(;;).
- 错误后如何停止循环“FOR”
- 如何使用循环 for 与 java 脚本一起检查输入中的值
- 如何正确使用ngRepeat,同时使用循环for
- 是否可以使用循环(for/while)来制作动画?
- 在循环for循环时如何进入和退出
- Javascript原型循环for in数组
- 在对象数组中循环for
- Javascript循环:for循环工作,但不能映射
- 如何创建一个循环"for"在json