#javascript #node.js #typescript
Вопрос:
У меня есть многомерный массив обещаний, но выполнение executeMethod
происходит до for
того, как заканчивается начальный цикл и код достигает второго for
цикла и Promise.all
.
executeMethod
это, конечно, асинхронная функция.
const MAX_NUMBER_OF_CONCURRENT_PROMISES = 100; const promisesArray: Promiselt;voidgt;[][] = []; let promiseArrayIndex = 0; let innerPromiseArrayIndex = 0; const objectsList = [......]; for (const bucketObject of objectsList) { if (innerPromiseArrayIndex === MAX_NUMBER_OF_CONCURRENT_PROMISES) { innerPromiseArrayIndex = 0; promiseArrayIndex ; promisesArray[promiseArrayIndex] = []; } promisesArray[promiseArrayIndex][innerPromiseArrayIndex] = ( executeMethod(bucketObject) ); innerPromiseArrayIndex ; } for (let i=0; ilt; promiseArrayIndex; i ) { await Promise.all(promisesArray[i]); }
Я хочу, чтобы выполнение выполнялось только после for (const bucketObject of objectsList)
завершения, и я вызываю Promise.all
каждый массив обещаний.
Пожалуйста, посоветуйте, как я могу это решить?
Ответ №1:
Это не Promise.all
то, что что-то выполняет, это executeMethod(bucketObject)
вызов. И все это происходит синхронно в вашем цикле, прежде чем вы начнете чего — то ждать.
Чтобы выполнить пакетное выполнение, используйте
const MAX_NUMBER_OF_CONCURRENT_PROMISES = 100; const objectsList = [......]; for (let index = 0; indexlt;objectsList.length; index =MAX_NUMBER_OF_CONCURRENT_PROMISES) { const promisesArray: Promiselt;voidgt;[] = objectsList.slice(index, index MAX_NUMBER_OF_CONCURRENT_PROMISES).map(executeMethod); await Promise.all(promisesArray); }
Комментарии:
1. Но если я правильно понимаю
promisesArray
, будет ли содержаться более 100 обещаний? Или это все еще будет массив из множества обещаний?2. @DavidFaizulaev
slice
никогда не берет из списка более 100 объектов. (Обычно 100, возможно, меньше на последней итерации).