Хотя вы можете использовать библиотеку, чтобы облегчить свою жизнь,
XMLHttpRequest
onXXXX на самом деле являются обработчиками событий, а onload является лишь одним из многих возможных событий. Полный список здесь: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Events
В этом случае у вас отсутствует обработчик ошибок:
xhr.onerror( ... )
Кроме того, если у вас есть доступ к современному браузеру, используйте
xhr.addEventListener('load'|'error'|..., ... )
вместо. Это фактически позволяет использовать несколько обработчиков, удалять обработчики и т. Д.
Относительно вашего образца кода:
function _fetch(url, callback)
const xhr = new XMLHttpRequest()
xhr.onload = function () {
if (xhr.readyState === xhr.DONE) {
// if (xhr.status === 200) callback(xhr.response)
// throw a 'custom' error if the server responds with 501
if (xhr.status === 501) throw new Error('Answer not found')
// This can never be caught because async functions break the stack.
// Intuition: If you can't return it, you can't throw either.
}
}
// rest of the fn
Затем я использую функцию _fetch:
try {
_fetch(endPoint, response => console.log(response))
} catch (error) { // error not caught
console.log(error)
}
В этом случае вам нужно изменить обратный вызов выборки, чтобы использовать два параметра в стиле, аналогичном node.js
В частности: _fetch(endPoint, (err, resp) => ... )
xhr.onload = function () {
if (xhr.readyState === xhr.DONE) {
// if (xhr.status === 200) callback(null, xhr.response)
// throw a 'custom' error if the server responds with 501
if (xhr.status === 501) callback(new Error('Answer not found'), null);
}
}
Конечно, разумно использовать обещания (или библиотеку). Убедитесь, что вы позвоните либо разрешите, либо отклоните хотя бы один раз.
function _fetch(endpoint, callback) {
return new Promise( (resolve, reject) => {
xhr.onload = function () {
if (xhr.readyState === xhr.DONE) {
// if (xhr.status === 200) resolve(xhr.response)
// throw a 'custom' error if the server responds with 501
if (xhr.status === 501) reject(new Error('Answer not found'));
}
}
});
}
Это позволяет использовать его следующим образом:
_fetch(endpoint)
.then ( res => console.log('result', res) )
.catch( e => console.log('error', e);