首页 > 解决方案 > JavaScript、异步/等待和承诺

问题描述

我对 async/await 和一些 Promises 有疑问。

我有这个代码。它从这里开始:

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 的任何评论?

标签: javascriptasync-await

解决方案


通过对data.map()异步进行回调,data.map()现在将数据转换为 Promises 数组,因为异步函数的返回值始终是 Promise。await只会等待 Promise 解决,而不是它们的数组。您应该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一个Promise,它将使用每个内部 Promise 解析的值数组来解析。最终这意味着你的鞋面let valid = await LoadRouter.load(body);应该用你期望的数组来解析。


推荐阅读