首页 > 解决方案 > 异步函数不等待 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)
...

更多可能有用的信息:

提前致谢

标签: node.jsasynchronouses6-promise

解决方案


如果我们不向 .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;
}

推荐阅读