异步函数不等待Promise
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步函数不等待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) ...
可能是usefuk的更多信息:
- 我正在等待另一个异步函数中的
getMeanWindSpeed()
结果 - 我尝试为数据库中的每个元素返回一个硬编码值(而不是调用
getWindSpeed()
,它工作正常,所以我想问题出在那个函数中。
提前感谢
我编写了以下异步node.js函数,该函数通过Mongoose访问我的数据库,因此是一个异步函数):function getWindSpeed(houseID)return new Promise(async ...
答案
为什么您在等待承诺。这是不好的做法。如果可以使用await和async做同样的事情。请参见下面的示例。
const fakeDelay = () => new Promise(r =>
setTimeout(() => r("data"), 1000);
)
const Household =
findById: () => fakeDelay()
async function getWindSpeed(householdID)
const household = await Household.findById(householdID)
console.log()
//stoch.norm(household.windSimulation.mu, household.windSimulation.sigma, 1)
return household;
const main = async () =>
getWindSpeed().then(console.log)
main()
另一答案
Household.find()是否可能不返回承诺?如果是这种情况,这将完全解释观察到的行为。
以上是关于异步函数不等待Promise的主要内容,如果未能解决你的问题,请参考以下文章