不等待 Promise 的异步函数
Asynchronous function not waiting for 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()
函数,但它并没有等待它完成,因为我根据 [= 得到了以下跟踪14=] 调试消息:
Begin
Finish
12.2322
23.1123
(more speeds)
...
一些可能有用的信息:
- 我正在等待另一个异步函数
getMeanWindSpeed()
的结果
- 我尝试 return 为数据库中的每个元素设置一个硬编码值(而不是调用
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;
}
为什么您将 await 与 promise 混为一谈。这是不好的做法。如果您可以使用 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()
//通知
async function getWindSpeed
将默认为 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()
函数,但它并没有等待它完成,因为我根据 [= 得到了以下跟踪14=] 调试消息:
Begin
Finish
12.2322
23.1123
(more speeds)
...
一些可能有用的信息:
- 我正在等待另一个异步函数
getMeanWindSpeed()
的结果 - 我尝试 return 为数据库中的每个元素设置一个硬编码值(而不是调用
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;
}
为什么您将 await 与 promise 混为一谈。这是不好的做法。如果您可以使用 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()
//通知
async function getWindSpeed
将默认为 promise