不等待 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)
...

一些可能有用的信息:

提前致谢

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