Javascript XMLHttpRequests в цикле? - PullRequest
0 голосов
/ 14 июня 2010

Я пытаюсь сохранить массив записей в базе данных 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 ]

3 голосов
/ 14 июня 2010

Есть довольно много проблем с этим кодом.Вот только первые, которые я нашел:

  1. Синтаксис for (x in object) должен использоваться только тогда, когда вы хотите перебрать все поля в объекте.В этом случае вы хотите перебрать массив, поэтому вы должны сделать это следующим образом:

    for (var rowindex = 0; rowindex < globalObj.AddedRows.length; rowindex++) {
    }
    
  2. При выполнении HTTP POST вы не должны помещать данные, которые вы хотитеизменить в URL.Поместите его в тело запроса - в качестве аргумента xmlhttp.send ().Вы на самом деле явно передаете длину содержимого - эта длина должна быть длиной данных, которые вы передаете в xmlhttp.send () - поэтому, передав NULL, это почти наверняка ваша основная ошибка.*

    Вместо того, чтобы использовать Firebug, было бы лучше использовать xmlhttp.onreadystatechange, чтобы выяснить, какие ваши запросы выполняются или не выполняются.Не думайте, что, как только вы отладите его в первый раз, он всегда будет успешным с тех пор.Обработка ошибок.

0 голосов
/ 14 июня 2010

В дополнение к dmazzoni:

Каждый раз, когда ваш цикл for отправляет асинхронный XML-запрос, он отменяет предыдущий запрос и, следовательно, предыдущий отменяется.Вам следует создать новый XMLHttpRequest (или ActiveXObject для IE) внутри цикла for или дождаться ответного вызова HTTP перед отправкой нового запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...