【问题标题】:Function that calls function containing async query to mongodb.find [duplicate]调用包含异步查询的函数的函数到 mongodb.find [重复]
【发布时间】:2018-05-26 17:33:50
【问题描述】:

有没有办法在其他函数中调用包含猫鼬查询的函数,以便其他函数正常工作?

我的第一个包含猫鼬查询的函数:

getUserTags = (id) => {
    User.findById(id)
    .exec( (error, user) => {
      if (error) {
        return next(error);
      } else {       
        return user;
      }
    })
}

还有我需要调用第一个函数的函数:

userTagToBookTagValues =  (id) => {
  const user = getUserTags(id);

  //I NEED THIS PART TO WORK AFTER getting data from getUserTags
  console.log(user);
  user.tags.forEach(tag => {
    console.log(tag)
  });
}

有没有办法让它正常工作并且第二个函数中的用户不会被定义?

【问题讨论】:

  • How do I return the response from an asynchronous call? Mongoose 已经支持其中涵盖的 2 个选项——回调和承诺(虽然不是在同一个调用中,所以每次你都会让你选择一个)。您需要将其扩展到您定义和调用自己的函数的方式——例如getUserTags(id).then(user => { ... })
  • getUserTags = (id) => User.findById(id).exec().catch(next);

标签: javascript node.js mongodb asynchronous


【解决方案1】:

您可能需要return User.findById? 像这样:

getUserTags = (id) => {
return User.findById(id)
.exec( (error, user) => {
  if (error) {
    return next(error);
  } else {       
    return user;
  }
})
}

【讨论】:

  • 它不起作用,仍然返回未定义。
  • 问题是 User.findById 是异步的,所以当 getUserTags 被调用时,它会调用这个函数,但会立即返回它自己。所以你必须想办法让 getUserTags 依赖于一个承诺。
【解决方案2】:

据我了解 .exec() 不返回任何内容,因此使用 .then 会出错。 但是,如果像这样重写,它可以完美地工作:

getUserTags = (id) => {
  return User.findById(id)
}

userTagToBookTagValues =  (id) => {
const user =  getUserTags(id).then((user) => {
  user.tags.forEach(tag => {
    console.log(tag)
  });
  }) ;
}

【讨论】:

【解决方案3】:

findById 是一个异步方法。

如果你的节点版本大于 8

getUserTags = id => User.findById(id).exec();

userTagToBookTagValues = async (id) => {
  try {
    const user = await getUserTags(id);
    user.tags.forEach(tag => {
      console.log(tag)
    });
  } catch (err) {
    next(err);
  }
}

或者你可以在调用getUserTags函数后使用then方法。

有关 asnc 方法的更多信息:

Medium

【讨论】:

  • getUserTags() 不返回任何内容。对它执行await 不会完成任何事情。
  • 谢谢,但是你给出的代码返回 SyntaxError: await is only valid in async function
  • 不能使用await,除非您将userTagToBookTabValues 声明为async。你可以只使用.then().catch()
  • 对不起,你是对的。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多