我对 async/await 和一些 Promise 有疑问。
我有这个代码。它从这里开始:
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 有什么评论吗?
最佳答案
通过异步回调 data.map()
,data.map()
现在将数据转换为 Promises 数组,因为异步函数的返回值始终是一个 Promise。 await
只会等待 Promise 解析,而不是等待 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);
}
}))
现在结果
是一个 Promise,它将使用每个内部 Promise 解析的值数组进行解析。最终,这意味着您的上层 let valid = wait LoadRouter.load(body);
应使用您期望的数组进行解析。
关于JavaScript、异步/等待和 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619117/