从数组中删除对象并更新列表视图时,我遇到了ajax调用问题。
在循环内部,如果我可以在线确认删除对象,我想从本机数组中删除该对象。问题是从本机数组删除不起作用,我不知道为什么。
代码:
for (var i = 0; i < tempShoppingCartArray.length; i++) {
var row = tempShoppingCartArray[i];
if(chosenSubMenuID.sid == row.sid && row.sent == 0){
var myUrl = someURL
$.ajax({
type: "POST",
url: myUrl,
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", wsTOKEN);
},
success: function(response) {
tempShoppingCartArray.slice(i,1); //this code does not work
$("#shopping-list li").eq(i).remove(); //this code does not work
},
error: function(jqXHR, exception) {
}
});
}
}
答案 0 :(得分:2)
您遇到的问题是因为尽管您认为在ajax请求的success
方法中i
将等于for
循环的当前迭代,它实际上将具有所有请求的最终值。
拿这个example:
var array = ["a","b","c"];
for(var i=0;i<array.length;i++){
$.ajax({
method:'GET',
url: '/echo/json',
success: function(){
console.log(i,"success");
}
});
};
您可能希望控制台中的输出为
0成功
1成功
2成功
实际上它是
3成功
3成功
3成功
这是由于ajax调用的异步性质,使得调用控制立即返回,因此直接执行所有3个请求。调用第一个success
时,循环控制变量已达到其限制(在本例中为3)。
解决这个问题的方法是使用IIFE围绕ajax调用生成一个范围,并将循环控制变量作为参数传递给出expected result:
var array = ["a","b","c"];
for(var i=0;i<array.length;i++){
(function(x){
$.ajax({
method:'GET',
url: '/echo/json',
success: function(){
console.log(x,"success");
}
});
})(i)
};
0成功
1成功
2成功
答案 1 :(得分:1)
我认为你想使用拼接功能,而不是切片:
tempShoppingCartArray.splice(i,1);
slice函数实际上并没有改变tempShoppingCartArray变量,而是调用array.slice(a,b)返回一个新数组,其中包含数组中从索引a到索引b的元素。对于array.splice(a,b),数组在索引a之后包含b元素并包含它。
同样正如@Jamiec指出的那样,由于ajax会进行异步调用,因此当请求处理时,你的i将继续递增。到这个结束时,我将达到阵列的长度。尝试在ajax调用后暂停。
$ajax(....);
break;
我认为这应该有用。