1 | 'use strict';
|
2 |
|
3 | const AppError = require('./appError');
|
4 |
|
5 | function isConcurrentRequestError (err) {
|
6 | return err instanceof AppError && err.code === 409 && /^Concurrent request/.test(err.message);
|
7 | }
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | const 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 |
|
27 | module.exports = concurrentTask;
|