【问题标题】:Working with nested await in javascript在 javascript 中使用嵌套等待
【发布时间】:2018-04-26 09:50:47
【问题描述】:

我正在使用 mongoose 在 Nodejs 应用程序中使用 MongoDB in-memoryMongoDB 数据库 实现缓存。这里 Nodejs 8.9 与 async/await 支持一起使用。


let get_func = async(userId) => {

    let is_cached = await cache_user.findOne({ user_id: userId });

    if(!is_cached){
        console.log("NOT CACHIED");
        let is_dbuser = await db_user.find({});
        console.log(is_dbuser);

    } else {
        console.log("CACHED");
    }

    console.log("LEAVING get_func")
};

get_func(100);

这是输出:

NOT CACHIED
[]
LEAVING get_func

但是db_user 填充了数据并且能够使用以下方法进行验证:

db_user.find({}, function(err, users) {
   if (err) throw err;
   console.log(users);
});

此外,如果怀疑函数返回错误并按该顺序产生结果,请与let is_error, is_dbuser = await db_user.find({}); 核对。

我应该如何处理这个嵌套的等待语句。 (但似乎函数正在等待第二次等待)。

【问题讨论】:

  • let is_error, is_dbuser = await db_user.find({}); 不会工作。如果 promise 被拒绝,await 会像 throw
  • 是的,似乎兑现了承诺。与您的其他月光查询一起正常工作。只有内部等待有问题。
  • 我似乎记得,为了在 Mongoose 中获得成熟的承诺,您需要 exec()。你试过吗:b_user.find({}).exec()
  • @Mark_M 是的...尝试使用exec()但同样的结果来了!

标签: javascript node.js mongoose async-await


【解决方案1】:

改为这样做

let get_func = async (userId) => {

    let is_cached = await cache_user.findById(userId);

    if(!is_cached){
        console.log("NOT CACHIED");
        let is_dbuser = await db_user.find({});
        console.log(is_dbuser);

    } else {
        console.log("CACHED");
    }

    console.log("LEAVING get_func")
};

get_func(100);

请注意,使用 findById 更有意义,除非它不满足您的查询要求,而且异步可能需要括号前的空格

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2022-08-24
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多