异步函数不等待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的主要内容,如果未能解决你的问题,请参考以下文章

# Promise的简单理解和基本使用

在映射下一项之前,异步等待映射不等待异步函数在映射函数内部完成

异步函数 - 等待不等待承诺

异步函数不等待Promise

DispatchQueue 不等待异步函数完成

异步等待不等待完成