Я бы рекомендовал этот довольно простой подход:
async function retry(promiseFactory, retryCount) {
try {
return await promiseFactory();
} catch (error) {
if (retryCount <= 0) {
throw error;
}
return await retry(promiseFactory, retryCount - 1);
}
}
Эта функция вызывает promiseFactory
и ожидает завершения возвращенного обещания. В случае возникновения ошибки процесс (рекурсивно) повторяется до тех пор, пока retryCount
не достигнет 0
.
Пример кода
Вы можете использовать функцию следующим образом:
await retry(
() => page.waitForXPath('//*[contains(@class, ".customer_name")]/ancestor::li'),
5 // retry this 5 times
);
Вы также можете передать любую другую функцию, возвращающую Promise, например Promise.all
:
await retry(
() => Promise.all([
page.goto(url),
page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
]),
1 // retry only once
);
Не совмещайте ожидание и улов
Еще один совет: вам не следует объединять await
с .then
или .catch
, так как это приведет к неожиданным проблемам. Либо используйте await
и окружите ваш код блоком try..catch
, либо используйте .then
и .catch
. В противном случае ваш код может ожидать завершения работы функции catch
и т. Д.
Вместо этого вы используете try..catch
вот так:
try {
// ...
} catch (error) {
logMyErrors(error);
}