提问者:小点点

使用带有async/await的mongoosepromise


我正在尝试在node.js的async/await功能中使用Mongoose promises。当调用我的函数时,我希望保存由函数查询的员工列表。虽然内部的语句返回预期的查询,但内部的返回,这表明我没有正确返回承诺。

我对许诺如此完全有可能是陌生的,所以我没有正确地理解这个范例。。。如有任何帮助,我们将不胜感激。

  printEmployees: async(company) => {
    var employees = await self.orderEmployees(company);
    // SECOND CONSOLE.LOG
    console.log(employees);
  },

  orderEmployees: (companyID) => {
    User.find({company:companyID})
    .exec()
    .then((employees) => {
      // FIRST CONSOLE.LOG
      console.log(employees);
      return employees;
    })
    .catch((err) => {
      return 'error occured';
    });
  },

共3个答案

匿名用户

您需要您的

    的函数 只有在与一起使用时才真正“等待”该值 承诺或,它们隐式返回
orderEmployees: (companyID) => {
  return User.find({ company:companyID }).exec()
}

同样非常重要的是,您应该在处理程序中使用而不是。从处理程序内返回将导致promise链触发它的,而不是它的,从而中断错误处理链。

更好的做法是,完全不要包含,让实际错误在promise链中出现,而不是用您自己的非描述性的消息覆盖它。

错误条件应该抛出错误,而不是返回错误。

您还可以等待非承诺,但仅限于同步求值的值。

匿名用户

为了使的行为像异步函数一样,您必须返回产生的承诺。在使用没有关键字的承诺时,有两条规则需要遵循:

    则为异步函数
  1. 如果您有一个承诺(例如由异步函数返回),您必须调用它的或返回它。/li>

当您使用时,您必须对您获得的承诺执行

这表示您将注意到您没有返回在内部生成的承诺。很容易修复,但是重写这个函数来异步也很容易。

orderEmployees: (companyID) => {
  return User.find({company:companyID}) // Notice the return here
  .exec()
  .then((employees) => {
    // FIRST CONSOLE.LOG
    console.log(employees);
    return employees;
  })
  .catch((err) => {
    return 'error occured';
  });
},

orderEmployees: async(companyID) => {
  try {
    const employees = await User.find({company:companyID}).exec();
    console.log(employees);
    return employees;
  } catch (err) {
    return 'error occured';
  }
},

PS:这里的错误处理有些瑕疵。我们通常不会通过从函数返回错误字符串来处理错误。在这种情况下,最好让错误传播,并从一些顶层UI代码处理它。

匿名用户

您没有返回OrderEmployees的承诺。

printEmployees: async(company) => {
  var employees = await self.orderEmployees(company);
  // SECOND CONSOLE.LOG
  console.log(employees);
},

orderEmployees: (companyID) => {
  return User.find({company:companyID})
 .exec()
 .then((employees) => {
   // FIRST CONSOLE.LOG
   console.log(employees);
   return employees;
 })
 .catch((err) => {
   return 'error occured';
 });
},