Синхронная функция вызова Javascript из внешнего файла JS - PullRequest
1 голос
/ 10 ноября 2011

У меня есть функция в файле .js, которая берет информацию, хранящуюся в localStorage, и синхронизирует ее с сервером, используя синхронные вызовы ajax. (Порядок интеграции жизненно важен, поэтому необходим синхронный режим)

function syncUp() {
    var xml = new XMLHttpRequest();
    xml.open("GET", "Default.aspx", true);  Also tried setting this to false
    xml.onreadystatechange = function() {
       if (xml.readyState == 4) {
         if (xml.status == 200) {
             var items = localStorage.getItem("SyncOrder");
             var sync = items.split(",");

             for (var i = 0; i < sync.length -1; i++) {
                 Perform repeated synchronous calls to webservice via AJAX to integrate each item to the server
              }
           }
        }
     }
  xml.send(null);
  }

syncUp () вызывается из нескольких мест. При вызове непосредственно из события onclick кнопки, где syncUp () является единственной вызываемой функцией и единственным выполняемым кодом, она прекрасно работает. Однако, если со страницы, где я сначала добавляю элемент в объект localStorage, а затем вызываю syncUp (), как показано ниже

function saveEdit(item) {
      var currData = localStorage.getItem("SyncOrder");
      localStorage["SyncOrder"] = currData + "," + item;
      syncUp();
}

, состояние xmlHTTPRequest возвращает 0, и синхронизация не выполняется. Что может помешать xmlHTTPRequest получить ответ 200, так как единственный код, выполняемый перед syncUp (), - это пара строк javascript, которые должны быть выполнены до того, как сайт даже попадет в syncUp ()?

1 Ответ

1 голос
/ 10 ноября 2011

Есть две причины кода состояния ноль.

  1. Выполнение вызовов из файлового протокола.
  2. Страница обновляется / перемещается по мере выполнения запроса.

В вашем случае я бы предположил, что это # ​​2. Если вы используете кнопку или ссылку для выполнения вызова Ajax, обязательно отмените действие щелчка с помощью preventDefault или return false.

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