Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.07.2019, 15:16
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Как перехватить ошибку XMLHttpRequest
Сторонняя js-библиотека делает запрос с помощью XMLHttpRequest, доступа к ее коду нет. Как перехватить ошибку запроса (4xx, 5xx, ...)?

window.onerror не перехватывает, хотя в консоли ошибка видна
Ответить с цитированием
  #2 (permalink)  
Старый 05.07.2019, 20:19
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Shitbox2
window.onerror не перехватывает, хотя в консоли ошибка видна
Почему оно должно перехватывать? Ведь происходящая ошибка связана с экземпляром класса XMLHttpRequest.

Вы можете отслеживать при помощи события fetch все исходящие запросы, выбирать из них те, которые связаны с той сторонней js-библиотекой, и если с таким запросом что-то пойдёт не так, например сервер возвратит статус 400, то составить свой запрос со статусом 200 и возвратить его!

Вот пример, файл service-worker.js
addEventListener("fetch", function (event) {
	if(new URL(event.request.url).host === "picsum.photos") {
		var promise = fetch(event.request).then(function(response) {
			if(response.status >= 400 && response.status < 599) {
				throw new Error("Not found");
			}
			
			console.log(response);
			return response;
		}).catch(function(error) {
			var response = new Response(error.message);
			response.headers.set("Content-Type", "text/plain;charset=UTF-8");
			return response;
		});
		
		event.respondWith(promise);
	}
});
Скрипт работает так: когда в случае запроса на picsum.photos, сервер отвечает со статусом 400-599, то ответ сервера заменяется на ответ, составленный вручную (текст Not found)

Скрипт можно подключить так...
navigator.serviceWorker.register("service-worker.js", {
  scope: "."
});
Ответить с цитированием
  #3 (permalink)  
Старый 05.07.2019, 21:44
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Shitbox2
Как перехватить ошибку запроса (4xx, 5xx, ...)?
В XMLHttpRequest событие ошибки считается по-другому, там либо есть ответ, либо это network error, а у нее status всегда 0. Пруф. Гипотетически можно так:
var XMLHttpRequest = function(XHR, type, listener) {
	return function() {
		var xhr = new XHR;
		xhr.addEventListener(type, listener);
		return xhr;
	};
}(XMLHttpRequest, 'loadend', function(e) {
	if (this.status == 0) {
		console.log(e.type, 'network error');
	} else {
		console.log(e.type, this.status);
	}
});

// js-library code...
Ответить с цитированием
  #4 (permalink)  
Старый 06.07.2019, 21:11
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Да, я как раз и сделал, переопределив XMLHttpRequest, что костыль, конечно. Про fetch не думал, проверю этот способ тоже. СпасибО!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обработать ошибку несколько раз и создать исключение? jtag Общие вопросы Javascript 2 18.12.2017 14:39
Как исправить ошибку «No 'Access-Control-Allow-Origin' header...» при аплоадинге карт femalemoustache Общие вопросы Javascript 4 29.06.2017 11:53
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как вывести ошибку в javascript? MCTrane Общие вопросы Javascript 13 05.05.2010 08:36