ПОВТОРНАЯ ПОПЫТКА АСИНХРОННОЙ ОПЕРАЦИИ

Недавно я тестировал написанный мной сервис Node.js, который выполняет операции с базой данных и HTTP-запросы; однако операции не всегда выполняются успешно, например: отправка данных в базу данных, а затем немедленный запрос данных может завершиться ошибкой. Вместо ожидания произвольного промежутка времени между такими вызовами (пока данные не будут проиндексированы), лучше обернуть вашу операцию какой-либо стратегией повторных попыток. Быстрый поиск в Интернете выявил множество библиотек, которые сделают это за вас, но ни одна из них не соответствовала тому, что я хотел, поэтому я написал свою собственную, которую вы можете найти по адресу: NPM, GitHub. Ниже описание библиотеки.

ОБЕЩАНИЕ-ПОВТОРИТЕ-ИЛИ-БРОСЬТЕ

Простая оболочка для повторного запуска любой функции, которая возвращает обещание.

УСТАНОВКА

$ npm install promise-retry-or-throw

ИСПОЛЬЗОВАНИЕ

import promiseRetry from 'promise-retry-or-throw';

promiseRetry(fn, [options])

Вызывайте обещание fn до тех пор, пока оно не разрешится или не будет достигнуто максимальное количество повторных попыток (или отклоненное обещание не будет соответствовать заданному фильтру досрочного завершения).

ОПЦИИ

  • maxNumberOfRetries : Максимальное количество попыток, которое необходимо сделать, прежде чем сдаться. По умолчанию 10
  • delayIncrease : Увеличение времени между каждой повторной попыткой (в миллисекундах). По умолчанию 1000
  • filter : Фильтр ошибок, позволяющий досрочное завершение, например. для неисправимых ошибок. По умолчанию () => false
  • calculateDelay : Функция для расчета задержки между каждой повторной попыткой. По умолчанию последняя задержка увеличивается на delayIncrease.

САМЫЙ ПРОСТОЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ:

const action = () => Promise.resolve(data);
promiseRetry(action)
.then(response => assert.deepEqual(response, data));

РАННЕЕ ПРЕКРАЩЕНИЕ

Некоторые ошибки следует рассматривать как неисправимые, и повторную попытку предпринимать не следует. Можно передать необязательную функцию filter, которая, как ожидается, вернет истинное значение для досрочного завершения.

const action = () => Promise.reject('test');
const options = {
filter: (error) => error == 'test'
}
return promiseRetry(action, options)
.then(() => {
throw new Error('promiseRetry should not have resolved')
})
.catch(error => assert.equal(error, 'test'));

ПОЛЬЗОВАТЕЛЬСКАЯ СТРАТЕГИЯ ЗАДЕРЖКИ

const customDelayIncrease = ({delay, delayIncrease}) => {
return delay * delayIncrease;
}
const options = {
maxNumberOfRetries: 40
delayIncrease: 10,
calculateDelay: customDelayIncrease
};
return promiseRetry(action, options);

Если вы нашли эту статью полезной/вдохновляющей, нажмите💚, чтобы другие тоже могли ею насладиться.

Спасибо за ваше время! Подпишитесь на меня в Twitter и LinkedIn.