Функции выполняются без ожидания обещания.все вызовы

#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, возможно, меньше на последней итерации).