使用与异步/等待的mongoose promises

Pat*_*ors 24 javascript asynchronous node.js promise

我正试图通过Node.js的async/await功能来使用Mongoose promises.当我的函数printEmployees被调用时,我想保存由orderEmployees函数查询的员工列表.同时,console.log语句内部orderEmployees返回预期的查询,返回的console.log内部,表明我没有正确地返回promise.printEmployeesundefined

我很容易接受承诺,以至于我没有正确理解范式......任何帮助都非常感激.

  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';
    });
  },
Run Code Online (Sandbox Code Playgroud)

Tam*_*dus 28

为了使orderEmployees行为像异步函数,您必须返回结果承诺.使用没有async/await关键字的promises时要遵循两条规则:

  1. 如果函数返回a,则该函数是异步的 Promise
  2. 如果您有一个承诺(例如由异步函数返回),您必须调用.then它或返回它.

当你使用时,async/await必须遵守 await你所获得的承诺.

这说你会注意到你没有返回内部产生的承诺orderEmployees.易于修复,但也很容易将该功能重写为异步.

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';
  });
},
Run Code Online (Sandbox Code Playgroud)

要么

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

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


Nik*_*des 20

你需要returnPromise,否则你正在等待返回的功能undefined.

orderEmployees: (companyID) => {
  return User.find({ company:companyID }).exec()
}
Run Code Online (Sandbox Code Playgroud)

你只能throw承诺; 或者标记为的函数return,它基本上返回一个.catch.