当前位置: 首页 > 知识库问答 >
问题:

javascript异步等待不等待猫鼬等待

施默
2023-03-14

我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用Users.findOne().exec()中的res.render()函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。

有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。

  • 节点猫鼬异步等待似乎很有希望,但他们的实际问题是未能返回项目,而我的返回罚款
  • 异步不等待等待是一个问题与kotlin
  • 异步等待不等待似乎非常适用,但我不完全理解关于嵌套等待/异步的答案-问题的asker有比我的查询更复杂,因为他们正在处理循环和每个
  • Javascript异步等待是现货,所以我检查猫鼬函数返回一个promise。猫鼬文档显示它已经为异步做好了准备,因为调用会返回一个promise。

假设我们正在解析路由/用户

routes/index.js

// requires & other routes not shown 
router.get('/users', controller.testUserShow);

控制器/index.js

// requires & other routes not shown 
   exports.testUserShow = async (req, res, next) => {
      if (req.user) { // if code to get user is right here, with no async/await, the user is found and the code continues
        try {
          found = await services.fetchUser(req.user._id)
          console.log("I am not waiting for at testusershow")
          console.log(found); //undefined
          // go on to do something with found
        } catch(e) {
          throw new Error(e.message)
        }
      }
    }

服务/index.js

const db = require('../db')
exports.fetchUser = async (id) => {
  try {
    console.log("fetchUser is asking for user")
    return await db.returnUser(id)
  } catch(e) {
    throw new Error(e.message)
  }
}

db/index.js

const User = require('../models/user');
exports.returnUser = async (id) => {
  User.findById(id)
      .exec(function(err, foundUser) {
          if (err || !foundUser) {
              return err;
          } else {
              // if this was in the controller 
              // we could res.render() right here
              console.log("returnUser has a user");
              console.log(foundUser); // this is a User
              return foundUser;
          }
      });
}

控制台日志将被删除

fetchUser is asking for user
I am not waiting for at testusershow
undefined
returnUser has a user
// not printed... valid user 

如果我调用的东西没有返回promise,但是User.findOne()

我错过了什么?

共有2个答案

宋和颂
2023-03-14

您的db/index应该如下所示:

exports.returnUser = (id) => {
  return User.findById(id);
}

当你不给exec打电话时,它会回复你的promise。由于您的services/index.js已经使用wait来获取响应,db/index不需要是异步函数。

计燕七
2023-03-14

这是最简单的方法:

const User = require('../models/user');
exports.returnUser =  (id) => {
   return User.findById(id).exec().then(foundUser => { 
          console.log(foundUser); // this is a User
          return foundUser;
  });
}

如果要使用async/await,则可以执行以下操作:

    exports.returnUser = async id => {
       const foundUser = await User.findById(id).exec();
       console.log({foundUser});
       return foundUser;
      });
    }

如果你想使用回调,它看起来像:

exports.returnUser =  (id, cb) => {
   return User.findById(id).exec(cb);
}

关于Mongoose的很酷的想法是,如果您不传递回调,它将从exec函数/方法返回一个promise。

 类似资料:
  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 问题内容: 我试图摆脱使用Mongoose Promise与Node.js的async / await功能的束缚。调用我的函数时,我想保存该函数查询的员工列表。同时,内部的语句返回期望的查询,在内部的returns返回,表明我没有正确返回promise。 我对承诺完全陌生,以至于我没有正确理解范例……非常感谢您的帮助。 问题答案: 您需要这样做,否则您正在等待返回的函数。 当前,您正在等待非承诺,

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 本文向大家介绍JavaScript 异步等待循环,包括了JavaScript 异步等待循环的使用技巧和注意事项,需要的朋友参考一下 示例 在循环中使用异步等待时,您可能会遇到其中一些问题。 如果您只是尝试在内部使用await forEach,则会抛出Unexpected token错误。 这是因为您错误地将箭头功能视为一个块。该await会在回调函数,这是不是上下文async。 解释器可以防止我们

  • 我正试图将图像上传到firebase存储,但调用该函数时,未执行wait以获取url。我错过了什么? 看看这个其他主题,我发现问题可能是“然后”,但我如何设置代码以等待url? 异步/等待/然后飞镖/颤振 谢谢

  • 问题内容: 我是一名普通的C#开发人员,但有时我会使用Java开发应用程序。我想知道是否有Java等效于C#async / await?简单来说,java相当于什么: 问题答案: 不,在Java中-甚至在v5之前的C#中,都没有等效的异步/等待方式。 在后台构建状态机是一项相当复杂的语言功能。 Java中对异步/并发的 语言 支持相对较少,但是该软件包包含许多与此相关的有用 类 。(不完全等同于任