Выполнение обещания. Все обещания. - PullRequest
0 голосов
/ 16 мая 2018

Я делаю 400-ые запросы к серверу - и помещаю каждое в обещания.

При выполнении всех 400 запросов в одном обещании. Все - система падает.

I 'я разделил мои запросы на пакеты из 50 обещаний (и добавил их в обещание. все) и добавил их все в другое обещание. все.

Как я могу выполнить обещания в пакетах и ​​ждать ихнужно сделать, прежде чем переходить к следующему?

// attach the other accounts a user has to the wrapper object
// **this is 400+ requests object, that has the requests in it**
// results are promises
const influencerAccounts = wrapper.map(p => addInfluencerAccounts(p));

// split the requests into chunks to stop the server falling over
const chunkedPromises = _.chunk(influencerAccounts, 50);

// promise.all on each chunk of promises/requests
// ????


// ...

return

Я пытался зацикливаться на чанкованных массивах обещаний (которые представляют собой массив обещаний) и Promise.all (ing) для каждого из них - но это не такдождаться окончания предыдущей партии перед отправкой следующей.

Спасибо,

Олли

1 Ответ

0 голосов
/ 16 мая 2018

Вы совершаете ошибку, которую сначала совершает лот людей: 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...