UNPKG

684 BJavaScriptView Raw
1'use strict';
2
3const AppError = require('./appError');
4
5function isConcurrentRequestError (err) {
6 return err instanceof AppError && err.code === 409 && /^Concurrent request/.test(err.message);
7}
8
9/**
10 * @param {function (): Promise.<T>} task
11 * @param {number} maxTimes
12 * @returns {Promise.<T>}
13 * @template T
14 */
15const concurrentTask = (task, maxTimes) => (
16 task().catch((err) => {
17 if (--maxTimes > 0 && isConcurrentRequestError(err)) {
18 return new Promise(res => setTimeout(res, Math.random() * 300))
19 .then(() => concurrentTask(task, maxTimes));
20 }
21
22 return Promise.reject(err);
23 })
24);
25
26
27module.exports = concurrentTask;