node.js - 异步函数不等待 Promise
问题描述
我编写了以下异步 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 - 如何使用 Node.js 通过 AWS SES 发送图像和文件附件?
- python - Pymodbus-read-input-registers CRC 无效,丢弃标头
- python - Python:Pandas groupby 处理大数据的时间太长
- r - 如何编辑校准图的图例?
- java - 适配器的 RecyclerView 问题
- bash - 无法在 Chef Recipe 中运行 bash 资源
- html - 我在 iPhone 上的 h1 标签有什么问题?
- html - Bootstrap 扩展卡导致 Bootstrap 导航栏出现问题
- php - 我想用 Jmeter 测试性能
- node.js - 使用 Node js 创建用于读写的电子表格