异步功能不等待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()函数,但是它并不等待其完成,因为我基于{{1} }调试消息:

console.log(...)

一些可能是usefuk的信息:

  • 我正在等待另一个异步函数中的Begin Finish 12.2322 23.1123 (more speeds) ... 的结果
  • 我试图为数据库中的每个元素返回一个硬编码值(而不是调用getMeanWindSpeed(),并且它工作正常,所以我想问题出在那个函数中。)

预先感谢

wgphgp 回答:异步功能不等待Promise

如果我们不将回调传递给.find(),我们将得到一个返回的承诺,这将使代码更易于阅读。

我们可以进一步简化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和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()

//通知

  

异步函数getWindSpeed

默认情况下为

本文链接:https://www.f2er.com/3012729.html

大家都在问