JavaScript, async / await и обещания - PullRequest
0 голосов
/ 07 января 2020

У меня проблема с async / await и некоторыми обещаниями.

У меня есть этот код. Это начинается здесь:

let valid = await LoadRouter.load(body);
console.log(valid);//showing me Pending Promises

Функция:

loadGeneratingUnits(data){
   let newUGArray = [];
   try {
     const result =  data.map(async (itemGU, index) => {
        const checGU = await this.checkDataGu(itemGU.nombre);
        if(!checGU){
           let newUG = {
              generating_unit_name: itemGU.nombre,
              description: (!itemGU.descripcion) ? null : itemGU.descripcion,
              it_generating_unit_id: (!itemGU.it_unidad_generadora) ? 0 : itemGU.it_unidad_generadora
           }
           newUGArray.push(newUG);
        }
     }) 

     return result;

   } catch (error) {
      throw new Error(error.message)

   }
}

Вот где у меня проблемы

async checkDataGu(guName = null){
  if(guName){
      return await generatingUnitModel.findOne({
         attributes: [
            'id',
            'generating_unit_name',
         ],
          where: {
              generating_unit_name: guName

          }
      })
  }

}

Любой комментарий об использовании async / await для этого кода?

1 Ответ

2 голосов
/ 07 января 2020

С помощью обратного вызова data.map() asyn c data.map() теперь преобразует данные в массив Promises , поскольку возвращаемое значение асинхронной функции c равно * 1005. * всегда Обещание. await будет только ждать разрешения Обещания, а не их массива. Вы должны использовать Promise.all для этого:

 const result =  Promise.all(data.map(async (itemGU, index) => {
    const checGU = await this.checkDataGu(itemGU.nombre);
    if(!checGU){
       let newUG = {
          generating_unit_name: itemGU.nombre,
          description: (!itemGU.descripcion) ? null : itemGU.descripcion,
          it_generating_unit_id: (!itemGU.it_unidad_generadora) ? 0 : itemGU.it_unidad_generadora
       }
       newUGArray.push(newUG);
    }
 }))

Теперь result равно one Обещание, которое будет разрешено с массивом значений, с которыми разрешено каждое внутреннее Обещание. В конечном итоге это означает, что ваш верхний let valid = await LoadRouter.load(body); должен разрешиться с ожидаемым массивом.

...