Почему мы пишем функцию onload () перед тем, как написать send () в XMLHttpRequest

1

Я новичок в XMLHttpRequest. Я не понимаю, почему мы пишем функцию onload() перед функцией send(). Функция onload() обрабатывает ответ, который мы получаем, и send() функция отправляет запрос на сервер. Поэтому onload() должен быть записан после функции send() в соответствии с моим пониманием. Может кто-нибудь помочь понять это.

var xmlhttp = new XMLHttpRequest(),
  method = 'GET',
  url = 'https://developer.mozilla.org/';

xmlhttp.open(method, url, true);
xmlhttp.onload = function () {
  // Do something with the retrieved data
};
xmlhttp.send();
  • 0
    Вы объявляете функцию onload, а не вызываете ее. Вы можете прочитать немного больше о функциях javascript, w3schools.com/js/js_functions.asp
Теги:
xmlhttprequest

1 ответ

4
Лучший ответ

Я не понимаю, почему мы пишем функцию onload() перед функцией send().

Чтобы обработчик нагрузки был установлен до отправки запроса, поскольку отправка запроса приведет к вызову обработчика (в случае успеха).

Функция onload() обрабатывает ответ, который мы получаем, и send() функция отправляет запрос на сервер. Поэтому onload() должен быть записан после функции send() в соответствии с моим пониманием.

Она вызывается после send называется (по XHR инфраструктура) (или потенциально во время). Когда вы назначаете его для onload, вы не вызываете его. Вы просто определяете его так, чтобы он там, когда XHR нужно было его назвать.

Вот что происходит:

  1. Вы создаете XHR.
  2. Вы регистрируете обработчик для события load (в вашем случае, назначая функцию onload).
  3. Вы вызываете send.
    1. Браузер запускает (и, возможно, завершает) запрос
  4. Когда запрос завершается, если он будет успешным, обработка XHR браузера запускает событие load. Это ищет любых зарегистрированных в настоящий момент обработчиков для запросов load и очередей для этих обработчиков, если они есть. Эти вызовы запускаются, как только основной поток JavaScript доступен для их запуска.

Очень часто вы избегаете делать это неправильно, потому что к моменту завершения запроса вы поместите туда обработчик load; но не всегда. load - это событие. Если запрос может быть немедленно удовлетворен (например, из кеша), браузер может запустить load во время send, и посмотреть, есть ли какой-либо обработчик load во время send вызова, а если нет, то нет очереди на вызов любой обратный вызов. Позже, когда вы прикрепляете обработчик, событие уже было запущено (когда ни один не был прикреплен).

Поэтому вы должны приложить обработчик перед вызовом send.

  • 0
    @ TJ Crowder: Итак, я могу написать send () перед onload (). Будет ли это вызвать какие-либо проблемы в моем заявлении.
  • 0
    @ user2613946: Я не знаю, где в моем первоначальном ответе вы думали, что читали это. Надеюсь, обновленный ответ прояснит ситуацию: нет, вы не можете надежно подключить ваш обработчик load после вызова send .
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню