ПОВТОРНАЯ ПОПЫТКА АСИНХРОННОЙ ОПЕРАЦИИ
Недавно я тестировал написанный мной сервис 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.