循环中的Javascript XMLHttpRequests?

时间:2010-06-14 08:16:56

标签: javascript loops xmlhttprequest

我正在尝试将一组记录保存到mysql数据库中,但我总是在firebug中获取中止消息,除了最后一次保存。如何使用XMLHttpRequest循环保存记录?这是我的代码:

function savingContent()
{
   if (window.XMLHttpRequest)
   {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();

   }
   else
   {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
   }

   var rowindex = 0;

   for (x in globalObj.AddedRows)
   {
      var rowData = "?q=" + globalObj.AddedRows[rowindex];

      xmlhttp.open("POST", "insertRowData.php"+rowData, true);
      xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
      xmlhttp.setRequestHeader("Content-Length",rowData.length); 
      xmlhttp.send(null);
      rowindex += 1;
}

2 个答案:

答案 0 :(得分:3)

此代码存在很多问题。这是我发现的第一个:

  1. 只有在想要迭代对象中的所有字段时才应使用for (x in object)语法。在这种情况下,你想迭代一个数组,所以你应该这样做:

    for (var rowindex = 0; rowindex < globalObj.AddedRows.length; rowindex++) {
    }
    
  2. 执行HTTP POST时,不应将要更改的数据放入URL中。将它放在请求的主体中 - 作为xmlhttp.send()的参数。你实际上是在显式传递一个内容长度 - 该长度应该是你传递给xmlhttp.send()的数据的长度 - 所以通过传递NULL几乎肯定是你的主要错误。

  3. 不要使用Firebug,最好使用xmlhttp.onreadystatechange来确定哪些请求成功或失败。不要假设一旦你第一次调试它,它将永远成功。处理错误。

答案 1 :(得分:0)

除了dmazzoni:

每次for循环发送异步xml请求时,它都会覆盖先前的请求,因此中止前一个请求。您应该在for循环中创建一个新的XMLHttpRequest(或IE的ActiveXObject),或者在发送新请求之前等待HTTP返回调用。