Вы совершаете ошибку, которую сначала совершает лот людей: Promise.all
не запускает ничего. Он просто ждет вещей, которые уже запущены . К тому времени, когда вы разбили массив influencerAccounts
на куски, вы, вероятно, уже перегружили сервер, потому что вы все равно отправляете ему более 400 запросов одновременно.
Вместо этого разбейте массив на части payout
, а затем обработайте его кусками, что-то вроде этого:
const results = [];
const promise =
_.chunk(payout, 50).reduce(
(p, chunk) =>
p.then(chunkResults => {
results.push(...chunkResults);
return Promise.all(chunk.map(startRequest));
})
,
Promise.resolve([])
)
.then(() => results);
Я использовал startRequest
выше вместо createInfluencerWrapper
и addInfluencerAccounts
, потому что мне было непонятно, представили ли вы одно или другое, пытаясь заставить ваш чанкинг работать. Но если нет, то startRequest
это просто addInfluencerAccounts(createInfluencerWrapper(entry))
.
Запускает блок из 50 запросов, использует Promise.all
для ожидания завершения всех из них, а затем запускает следующий блок из 50 запросов. Часть «сделай это тогда, когда это будет сделано, сделай это» происходит из идиомы обещания reduce
, которая в простом виде выглядит так:
someArray.reduce((p, entry) => p.then(() => doSomethingWith(entry)), Promise.resolve());
Он начинается с разрешенного обещания и подключает к нему обработчик then
для выполнения следующей операции, который подключает обработчик then
к , для выполнения следующей операции и т. Д.
Если вам не нравится закрывать results
, мы можем передать его по цепочке reduce
; Вот первая версия выше, которая делает это:
const promise =
_.chunk(payout, 50).reduce(
({p, results}, chunk) => ({
p: p.then(chunkResults => {
results.push(...chunkResults);
return Promise.all(chunk.map(startRequest));
}),
results
}),
{p: Promise.resolve([]), results: []}
)
.then(({results}) => results);