设置异步等待功能顺序

问题描述 投票:1回答:4

我有两个功能都是异步的。我想确保一个接一个被执行以下代码位于异步内

const user= await User.find({
      _id: req.user.id
    });

const userName= `my user name is ${user.userName}`;
const email= `my email is ${user.email}`;

const {response} = await printUser({userName,email};

问题是在我找到用户之前执行了printUser函数因此userName和email的值是未定义的。

注意:以下代码在快速路由器中,并且查找功能正在运行(正在重现用户)

javascript node.js mongodb mongoose
4个回答
1
投票

我假设所有这些代码行也都在异步函数中。

您的问题是,find返回一个用户数组而不是单个用户,更改

const user= await User.find({
      _id: req.user.id
    });

收件人:

const user= await User.findOne({
      _id: req.user.id
    });

如果代码不在函数中而是在主文件中,那么您将必须使用回调。


0
投票

您需要使用回调。如下所示:

User.find({
      _id: req.user.id
    }, function (user) {
    printUser(user.userName, user.email); 
});

0
投票

根据您提供的代码,看起来User.find不会返回Promise,因此它将继续进行下一个操作,而无需等待结果。

您可以使用回调方法使它返回Promise

  const user = await new Promise(result =>
    User.find(
      {
        _id: req.user.id,
      },
      resolve,
    ),
  );

  const userName = `my user name is ${user.userName}`;
  const email = `my email is ${user.email}`;

  const { response } = await printUser({ userName, email });


0
投票

假设您是猫鼬,它不会为查询函数返回promise(在此处阅读https://mongoosejs.com/docs/promises.html#queries-are-not-promises)。您可以使用.then或使用.exec来返回正确的承诺。像

const user = await (User.find({
      _id: req.user.id
    })).exec();

const userName= `my user name is ${user.userName}`;
const email= `my email is ${user.email}`;

const {response} = await printUser({userName,email};

© www.soinside.com 2019 - 2024. All rights reserved.