XMLHttpRequest случайный сбой при readyState и статусе

#javascript #xml #xmlhttprequest

#javascript #xml #xmlhttprequest

Вопрос:

Я решаю одну проблему около 3 часов, искал много тем по этому поводу … но я все еще в тупике.

Хотите загрузить XML-файл с сервера при загрузке (пробовал также из общедоступной папки, тот же результат) и использовать их для API, аналогичного Google Maps (но API — это не проблема).

Я перепробовал много способов, как записать загрузку xml через XMLHttpRequest, но всегда одно и то же.

Несколько раз все в порядке, затем я меняю какой-то небольшой код и терплю неудачу, а затем, если я отменяю изменения, он все равно терпит неудачу… Не могу распознать шаблон, что может быть не так.

Проблема в том, что состояние готовности иногда равно 1, а статус 0. Иногда все в порядке, и я могу перейти к телу функции.

Я запускаю сервер apache с php (symfony), и путь к файлу в порядке (я тоже вижу его в браузере. И еще раз … иногда это нормально)

Вот мой код для начала файла js:

 var request = new XMLHttpRequest();
request.open("GET", 'http://localhost/project/src/test.xml', true);
request.responseType = 'document';
request.overrideMimeType('text/xml');
request.onload = function () {
  if (request.readyState === request.DONE) {
    if (request.status === 200) {
      console.log(doc);
      // Some other code (parsing xml)
    }
  }
};
request.send();
 

Возможно, необходим какой-то другой способ загрузки, кроме как через XMLHttpRequest, но не знаю, как в конечном итоге.

Спасибо за помощь!

Комментарии:

1. Теперь мне пришла в голову идея. Может быть, это потому, что загрузка XML является асинхронной? Так что, может быть, нужно что-то вроде await в c #?

2. Попробуйте onreadystatechange подход.

3.Обычно вы проверяете readyState внутри обработчика readystatechange событий. Это связано readyState с тем, что значение изменится с 0 на 4 , и вы захотите что-то сделать, когда readyState 4 оно будет достигнуто. Обработчик onload события будет вызываться всякий 4 раз, когда будет достигнут, поэтому проверка readyState ничего не даст. Но где doc определена переменная? И вы проверяете свойства responseText or responseXML всякий onload раз, когда запускается?

4. Да, это асинхронно, но поскольку JavaScript управляется событиями, можно дождаться запуска load события, прежде чем продолжить. Хотя async / await это просто еще один способ приблизиться к вашему коду, но не объяснит, с чем вы столкнулись.

5. Хм, onreadystatechange помогает (y) . Но у меня все еще есть вопрос.. Я хочу использовать данные из этого тела сразу после отправки. И, как я вижу в debugger , код в разделе send вызывается до ввода тела onreadystatechange, это означает, что я не могу использовать данные из этого запроса. Как дождаться завершения запроса?