Javascript既不等待也不等待方法完成

时间:2020-10-19 20:10:00

标签: javascript node.js asynchronous async-await

我觉得有些不可理解的内容,但是Google的搜索结果非常复杂。请帮助我。

app.post('/api/trigger-push-msg/', function (req, res) {
  getAllSubscriptionsFromDatabase()
  .then(function(subscriptions) {
    console.log(subscriptions)
    ...
async function getAllSubscriptionsFromDatabase() {
  let subscriptions = [];

  await db.find({}, function (err,docs){
    subscriptions = docs;
    console.log("Docs"+docs)
    return(docs);
  })
  return subscriptions;
};

据我了解,它应该等待getAllSubscriptions。在这种情况下,它将打印以下内容:

文档[对象对象]

[对象对象]

但是它正在打印:

(0)[]

文档[对象对象]

3 个答案:

答案 0 :(得分:0)

非常感谢,它看起来像Express supports promises in API callbacks

类似的事情可能起作用。通过使回调异步,我们隐式返回了一个Promise,以确保Express知道等待数据库调用。

对数据库的调用需要转换为返回承诺,以便我们可以将其连接到承诺链。

app.post('/api/trigger-push-msg/', async (req, res) => {
  const subscriptions = await getAllSubscriptionsFromDatabase()  
  console.log(subscriptions)
  // ...
})

function getAllSubscriptionsFromDatabase() {
  return new Promise((resolve, reject) => 
    db.find({}, (err, docs) => err ? reject(err) : resolve(docs))) // is that first empty object correct?
}

答案 1 :(得分:0)

我不知道您使用什么数据库软件,但问题可能是您期望基于回调的API的行为类似于基于Promise的API。

如果是这种情况,则必须检查数据库软件是否提供基于Promise的API,如果没有,则将DB调用包装到Promise中,如下所示:

const dbFind = (...args) => new Promise((rs, rj) => db.find(...args, (err, data) => {if(err) rj(err); rs(data)}))

因此,这可能会起作用:

const dbFind = (...args) => new Promise((rs, rj) => db.find(...args, (err, data) => {if(err) rj(err); rs(data)}))

async function getAllSubscriptionsFromDatabase() {
  const subscriptions = await dbFind({}) // <-- No callback! Result is "returned" by `await`
  
  console.log('Subscriptions (aka. docs)', subscriptions)
  return subscriptions;
};

答案 2 :(得分:0)

问题出在await db.find({}, callback)上。 关键是,如果您将回调函数作为第二个参数传递,则大多数异步函数都不会返回promise

尝试像这样重组您的代码,简单而优雅-

async function getAllSubscriptionsFromDatabase() {
  let subscriptions = [];

  const docs = await db.find({});
  console.log(subscriptions);
  return subscriptions;
};
相关问题