删除ajax中的对象

时间:2015-01-29 12:26:57

标签: javascript jquery ajax

从数组中删除对象并更新列表视图时,我遇到了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) {

                }
           });
       }
  }

2 个答案:

答案 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;

我认为这应该有用。