myVar=0;
for(i=0;i<5;i++){
$.ajax({
//AJAX Paramters
}).success((response) => {
sessionStorage.setItem(myVar+'Stored', JSON.stringify(response['somekey']))
});
myVar++;
}
我要实现的目标:将密钥[myVar0Stored,myVar1Stored,...]存储到会话存储中。
问题:如果AJAX调用花费很长时间,则可能在存储先前的密钥之前发生myVar = 3,这意味着不会存在“ myVar0Stored,myVar1Stored,myVar2Stored”密钥。如果我要发出同步GET请求,它可能会锁定浏览器,直到收到响应为止。我不确定如何将密钥存储在会话存储中。
tl; dr-如何在循环中更新myVar之前获取其值?
答案 0 :(得分:0)
我不确定为什么首先要使myVar
成为全球性的。问题的根源在于,箭头函数内的myVar
将是全局变量的当前值。如果您仅使用let i
(无论如何也从0到4),它将具有局部作用域,这将确保arrow函数中引用的i
特定于循环的迭代...
for(let i=0;i<5;i++){
$.ajax({
//AJAX Paramters
}).success((response) => {
sessionStorage.setItem(i+'Stored', JSON.stringify(response['somekey']))
});
}
答案 1 :(得分:0)
这是异步执行中遇到的一个常见问题,如果您还使用超时,则将解决该问题,以解决该函数内部进行ajax调用的问题。
当您尝试执行并使用myVar的值时,问题就在这里,ti将被更改 因此,要解决此问题,您一定不要使用相同的myVar变量,而不是调用函数,而将myVar作为参数传递给该函数,然后执行ajax调用,这样将使用传递的值而不是变量
myVar = 0
for (var i = 1; i <= 3; i++) {
(function(myVar) {
$.ajax({
//AJAX Paramters
}).success((response) => {
sessionStorage.setItem(myVar+'Stored', JSON.stringify(response['somekey']))
});
})(i);
myVar++
}
您也可以像这样写其他方式
myVar=0;
for(i=0;i<5;i++){
makeAjaxCall(myVar)
myVar++;
}
function makeAjaxCall(i) {
$.ajax({
//AJAX Paramters
}).success((response) => {
sessionStorage.setItem(myVar+'Stored', JSON.stringify(response['somekey']))
});
}