jQuery AJAX-引用变量被覆盖

时间:2018-07-03 07:53:33

标签: javascript jquery ajax

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之前获取其值?

2 个答案:

答案 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']))
});
}