gpt4 book ai didi

node.js - 异步函数不等待 Promise

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:47 25 4
gpt4 key购买 nike

我编写了以下异步node.js函数,它通过Mongoose访问我的数据库,因此是一个异步函数):

function getWindSpeed(householdID){
return new Promise(async function (resolve, _){
const household = await Household.findById(householdID)
resolve(stoch.norm(household.windSimulation.mu, household.windSimulation.sigma, 1))
})
}

另一方面,我有以下函数,它也是异步的,因为两者都访问数据库并对数据库中的每个元素使用前一个函数:

async function getMeanWindSpeed() {
return new Promise(async function (resolve, reject){
let numberOfHouseholds = 0
let averageWind = 0.0
console.log('Begin')
await Household.find({}, async function (error, households) {
if(error){
reject(error)
}else{
numberOfHouseholds = households.length
for(let i = 0; i < households.length; i++){
const speed = await wind.getWindSpeed(households[i].id)
console.log(speed)
averageWind += speed

}
}
})
averageWind = averageWind / numberOfHouseholds
console.log('Finish')
resolve(averageWind)
})
}

如您所见,我迭代集合中的所有元素并应用 getWindSpeed() 函数,但它不会等待其完成,因为我得到以下基于以下跟踪console.log(...) 调试消息:

Begin
Finish
12.2322
23.1123
(more speeds)
...

一些可能有用的更多信息:

  • 我正在等待另一个异步函数中 getMeanWindSpeed() 的结果
  • 我尝试为数据库中的每个元素返回一个硬编码值(而不是调用 getWindSpeed())并且效果很好,所以我猜问题出在该函数中。

提前致谢

最佳答案

如果我们不向 .find() 传递回调,我们将得到一个返回的 Promise,这使得代码更容易阅读。

我们可以进一步简化函数 getMeanWindspeed,因为它成为 getAverageWindSpeed() 的简单包装器;

例如:

async function getAverageWindspeed() {
let numberOfHouseholds = 0
let averageWind = 0.0
let households = await Household.find({});
numberOfHouseholds = households.length
for(let i = 0; i < households.length; i++){
const speed = await wind.getWindSpeed(households[i].id)
console.log(speed)
averageWind += speed
}
return averageWind / numberOfHouseholds;
}

async function getMeanWindSpeed() {
console.log('Begin')
let averageWind = await getAverageWindspeed();
console.log('Finish')
return averageWind;
}

关于node.js - 异步函数不等待 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59092286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com