我正在使用javascript循环来创建localstorage变量。由于某种原因,除最后一个之外,所有localstorage值都为null。有谁知道为什么?
这是我的代码:
function setValues() {
var json = jQuery.parseJSON(data);
for (var i=0; i<json.length; i++)
{
var id = json[i].id;
$.ajax({
url: url,
crossDomain: true,
type: 'post',
data: {
'theid': id
},
success: function (data2) {
window.localStorage['club'+id] = data2;
},
});
}
}
function getValue(id) {
console.log(window.localStorage.getItem('club'+id));
}
我调用getValue()else代码中的哪个位置与问题无关。如果&#39; id&#39;是用于添加到localstorage的最后一个id,它不是null。但是,好像所有以前的值都被覆盖了。
如何解决此问题?任何帮助,将不胜感激。谢谢!
答案 0 :(得分:3)
根据OP的问题变更回答问题
这实际上是一个非常常见的JavaScript问题,几乎不可能搜索,除非你已经知道所涉及的魔术字的答案。
因为你的措辞与通常的问题略有不同,我不打算投票来解决这个问题,而是解释发生了什么。
变量i
只有一个副本,并且该循环运行时该变量会发生变化。当回调返回时,该循环已经结束并且i
已达到其最终值。
您需要做的是捕获该值的本地副本。有两种方法可以做到 - 我将展示最容易阅读的方法:
function doAjax(i) {
// this 'i' is private.
var id = json[i].id;
$.ajax({
url: url,
crossDomain: true,
type: 'post',
data: {
'theid': id
},
success: function (data2) {
window.localStorage['club' + id] = data2;
}
});
}
function setValues() {
var json = jQuery.parseJSON(data);
for (var i = 0; i < json.length; i++) {
doAjax(i);
}
}
另一种方法是使用闭包和匿名函数:
function setValues() {
var json = jQuery.parseJSON(data);
for (var i = 0; i < json.length; i++) {
(function (i2) {
// this 'i' is private.
// Givign it the name of 'i2' just to be clear
var id = json[i2].id;
$.ajax({
url: url,
crossDomain: true,
type: 'post',
data: {
'theid': id
},
success: function (data2) {
window.localStorage['club' + id] = data2;
},
});
// this is the 'i' from the main loop
}(i));
}
}
有关详细信息,请参阅