@chelnokov_a

Как преобразовать Promis.all в последовательные запросы?

Всем привет. Есть вот такая конструкция

return Promise.all(products.map(p =>
                        // eslint-disable-next-line new-cap
                        ms.GET('report/stock/bystore', {
                            number: 100,
                            'product.id': p.id,
                            groupBy: 'variant',
                            stockMode: 'positiveOnly'
                        }).then(stock => {
                            // console.log(p)
                            p.stock = _.get(stock, 'rows.0.stockByStore').map(item => {
                                delete item.meta;
                                
                                return item;
                            });
                            // console.log('Одна из вариаций')
                            // console.log(p.name)
                            // console.log(p.stock)

                            return p;
                        }).catch(error => {
                            GateWarehouseError
                                .ensureError(error, GateWarehouseError.CODES.VARIANT_BY_STOCK)
                                .bind({ article, productId: p.id })
                                .log('warn');

                            return p;
                        })
                    )).then(stock => {
                        return stock;
                    });


Делов том что установлен определенные лимит на кол-во пораненных запросов и отрабатывает не всегда. Хочу перевести все это дело в последовательные запросы но ума не хватает. Подскажите что и как
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
Как советуют выше, проще всего использовать async-await и цикл for-of, но если нет возможности их использовать, то тогда можно просто построить цепочку промисов, примерно вот так:
const promises = [
  Promise.resolve("first"), 
  Promise.resolve("second"), 
  Promise.resolve("last")
];

function makePromiseChain(arrayOfPromises) {
  return arrayOfPromises.reduce((acc, current) => acc.then(() => current, Promise.resolve()));
}

makePromiseChain(promises).then(() => {
  console.log("done");
});


Если хочется часть запросов выполнять параллельно, например: первые 3 запроса параллельно, затем следующие 3 параллельно и т.д., то можно массив промисов разбить на чанки:

// если в проекте есть lodash, то в нём есть метод _.chunk
function makeChunks(array, chunkSize) {
  const chunks = [];
  for (let i = 0, j = array.length; i < j; i += chunkSize) {
    const chunk = array.slice(i, i + chunkSize);
    chunks.push(chunk);
  }
  return chunks;
}

// выполняем запросы параллельно по 3 штуки
makePromiseChain(
  makeChunks(promises, 3)
    .map(chunk => Promise.all(chunk))
).then(() => console.log('Done'))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы