Вы можете создать функцию, которая вызывает infoGetter
и рекурсивно вызывает себя, если есть дополнительные запросы, которые необходимо выполнить, приковав цепью к вызову ajax, возвращенному infoGetter
. Затем вызовите эту функцию 3 раза, чтобы при каждом успешном выполнении запроса он снова вызывал makeRequest
:
let min = 1;
const limit = 1000;
const myId = 12345;
const makeRequest = () => {
const max = min + 50;
infoGetter(myId, min, max)
.then(() => {
if (min < limit) {
makeRequest();
}
});
min = max;
};
makeRequest();
makeRequest();
makeRequest();
или
const maximumConcurrentRequests = 3;
for (let i = 0; i < maximumConcurrentRequests; i++) {
makeRequest();
}
Если вы хотите, чтобы процесс продолжался, даже если запрос не выполняется, catch
Обещание перед вызовом .then
для него:
infoGetter(myId, min, max)
.catch(() => void 0)
.then(() => {
Или, в полном объеме:
let min = 1;
const limit = 1000;
const myId = 12345;
const makeRequest = () => {
const max = min + 50;
infoGetter(myId, min, max)
.catch(() => void 0)
.then(() => {
if (min < limit) {
makeRequest();
}
});
min = max;
};
Демонстрация в реальном времени, где infoGetter
моделируется с использованием Обещание, которое разрешается после случайного числа от 0 до 5 секунд:
const infoGetter = () => new Promise(res => setTimeout(res, Math.random() * 5000));
let min = 1;
const limit = 1000;
const myId = 12345;
const makeRequest = () => {
console.log('making request for', min);
const max = min + 50;
infoGetter(myId, min, max)
.catch(() => void 0)
.then(() => {
if (min < limit) {
makeRequest();
}
});
min = max;
};
const maximumConcurrentRequests = 3;
for (let i = 0; i < maximumConcurrentRequests; i++) {
makeRequest();
}
Если вы также хотите определить, когда все запросы выполнены, поместите начальные обещания в массив, верните обещания из рекурсивных вызовов и вызовите Promise.all
в массиве :
const infoGetter = () => new Promise(res => setTimeout(res, Math.random() * 5000));
let min = 1;
const limit = 500;
const myId = 12345;
const makeRequest = () => {
console.log('making request for', min);
const thisMin = min;
const max = min + 50;
min = max;
return infoGetter(myId, thisMin, max)
.catch(() => void 0)
.then(() => {
if (min < limit) {
return makeRequest();
}
});
};
const maximumConcurrentRequests = 3;
Promise.all(
Array.from(
{ length: maximumConcurrentRequests },
makeRequest
)
)
.then(() => {
console.log('All done');
});