Событие onloadend XMLHttpRequest не выполняется при ошибке - PullRequest
0 голосов
/ 30 сентября 2019

Есть ли событие, которое будет работать в случае успеха или ошибки с модулем XMLHttpRequest Node.js? В соответствии с docs событие onloadend должно запускаться как при ошибке, так и при успехе, но только при успехе. Например:

var XMLHttpRequest = require( 'xmlhttprequest' ).XMLHttpRequest;

var url = 'https://www.example-bad-url.com/json.php';

var xhr = new XMLHttpRequest();

xhr.open( 'GET', url );
xhr.send();

xhr.onloadend = function() {
    // This should get logged, but it doesn't.
    console.log( 'The request has completed, whether successfully or unsuccessfully.' );
}

В приведенном выше сценарии onloadend не запускается, почему? URL-адрес не существует, поэтому он должен вызвать onloadend в виде ошибки и записать «Запрос завершен ...», но функция обратного вызова никогда не запускается, почему?

1 Ответ

1 голос
/ 30 сентября 2019

Библиотека xmlhttprequest для node.js не полностью правильно реализует спецификацию.

Если мы углубимся в код на github, мы увидим следующую строку кода:

  if (self.readyState === self.DONE && !errorFlag) {
    self.dispatchEvent("load");
    // @TODO figure out InspectorInstrumentation::didLoadXHR(cookie)
    self.dispatchEvent("loadend");
  }

Таким образом, обработчики событий load и loadend запускаются только при отсутствии ошибки, что согласуется с нашими наблюдениями, где

xhr.onloadend = function() {
    // This should get logged, but it doesn't.
    console.log( 'The request has completed.' );
};

будет регистрироваться только при успешном завершении события.

Мой совет - запускать событие вручную в обработчике .onerror(), который работает. Имейте в виду, что это сторонний модуль node.js, а не нативный.

Лично я только что написал небольшую оболочку для xmlhttprequest, которая имитирует интерфейс .fetch(). Версия node.js использует нативную библиотеку node.js http, а версия на стороне клиента - xmlhttprequest.

Таким образом, я могу использовать один и тот же API .fetch() как для внешнего кода, так и для внутреннего кода, ипросто позвольте системе решить, будет ли она использовать нативную выборку, выборку на основе xmlhttp или выборку на основе http.

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