【问题标题】:async/await issue (returns undefined) mongoose异步/等待问题(返回未定义)猫鼬
【发布时间】:2021-04-20 12:16:06
【问题描述】:

当我调用方法interval时,我从方法allUserStats得到的参数user总是未定义的。这是方法

const interval = async () => {
    const allUsers = await getAllUser();
    for (const u of allUsers) {
            let user;
            let followerScore;
            let subscriberScore;
            //let hostsScore;
            let viewerScore;
            await getAllUserStats(u.login_name).then(async (userStats)=>{
                user = userStats;
...

getAllUserStats 方法如下所示:

const getAllUserStats = async (login_name) => {
    await userstats.findOne({login_name}).then(async(userStats)=>{
        if(userStats===null){
            let user = new userstats({
                login_name:login_name,
                followers: [],
                subscribers: [],
                hosts: [],
                viewers: []
            })
            await user.save();
            return user;
        }
        else{
            return userStats;
        }
    })
}

我认为这是一个异步等待问题,但我不知道。有什么建议可以解决吗?

【问题讨论】:

  • 您是否尝试过从getAllUserStats 函数返回一些内容?例如return await userstats...
  • 是的,getAllUserStats 不返回任何内容。您可以 a) 返回一个 Promise/then-chain 和 await 函数调用或 b) await 结果,然后实际返回它。您仍在尝试从回调函数返回,这将简单地丢弃该值。有效的return 必须直接在函数内部,不能用回调函数包装。
  • @ChrisG 谢谢,现在可以了。您能否将您的评论添加为答案,以便我接受并关闭该主题?
  • 我已经展示了@ChrisG 评论 (B) 选项可能看起来像。这通常是最好的选择——如果你正在使用 async/await,那就去使用它吧!忘记.then
  • @TKoL 这正是我现在所做的。非常感谢!

标签: javascript mongoose async-await


【解决方案1】:

您正在混合 async/await 并使用 promise.then -- 您可以使用 async/await 编写所有内容,这应该会更容易:

const getAllUserStats = async (login_name) => {
    const userStats = await userstats.findOne({login_name})
    if(userStats===null){
        let user = new userstats({
            login_name:login_name,
            followers: [],
            subscribers: [],
            hosts: [],
            viewers: []
        })
        await user.save();
        return user;
    }
    else{
        return userStats;
    }
}

【讨论】:

  • 虽然并不总是好的做法,但将 await 和 then 结合起来通常是可以的(例如,使用链式 .json() 等待 fetch 调用)。然而,这个问题是关于一个问题的:OP 只是忘记从他们的函数中返回一些东西。它主要是有史以来链接最多的欺骗:stackoverflow.com/questions/14220321/…
猜你喜欢
  • 2020-10-16
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2019-05-10
  • 2020-05-16
  • 2019-03-25
  • 1970-01-01
相关资源
最近更新 更多