我觉得有些不可理解的内容,但是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)[]
文档[对象对象]
答案 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;
};