Вы не показали, как вы извлекаете содержимое страницы, но я предполагаю, что вы используете что-то вроде fetch
или XMLHttpRequest
.Если вы используете fetch, он возвращает Promise, который отклоняет сетевые ошибки, то есть вы можете прикрепить обратный вызов к его .catch()
методу, который повторяет выборку.Если вы используете XMLHttpRequest, у него есть событие onerror
, к которому можно вместо этого присоединить тот же повторный обратный вызов.
Я бы посоветовал вам разбить код выборки контента на функцию, которая принимаетURL и номер повтора, затем возвращает либо XMLHttpRequest, либо fetch
Promise.Таким образом, вы можете сделать обратный вызов с ошибкой, просто вызвав ту же функцию еще раз, но с retries-1
, переданным для параметра retry.
Примеры:
function fetchWithRetry(url, tries) {
if (tries <= 0) { return Promise.reject('Could not fetch.'); }
return fetch(url).catch(() => fetchWithRetry(url, tries - 1));
}
// OR:
function fetchWithRetry(url, tries) {
if (tries <= 0) { throw new Error('Could not fetch.'); }
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onerror = () => fetchWithRetry(url, tries - 1);
xhr.send();
return xhr;
}
Подход, основанный на обещаниях, - этонемного приятнее, потому что из-за цепочки обещаний ваш основной код может просто предполагать, что повторные попытки обрабатываются, и вы можете прикрепить .then()
, который будет запускаться, если любая попытка будет успешной, и .catch()
, который будет выполняться только, если все попыткипотерпеть поражение.С XHR его основанный на событиях характер означает, что, если ему придется повторить попытку, ваш основной код потеряет свою ссылку на текущий XHR.