【发布时间】:2018-09-11 04:51:58
【问题描述】:
我有这个功能
/* GET main page */
router.get('/', (req, res, next) => {
Account.find({accType: 'Employer'}, (err, col) => {
if (err) {
console.log(err);
} else {
Banner.findOne((err, banner) => {
if (err) {
console.log(err);
} else {
// Determine whether there is at least one awaiting account.
Account.findOne({accType: 'Awaiting'}, (err, doc) => {
if (err) {
console.log(err);
} else {
if (doc != null) {
var awaiting = true;
}
console.log(doc);
res.render('admin/', {
title: 'Admin pannel',
user: req.user,
employers: col,
areAwaiting: awaiting,
banner: banner,
)
}
}
);
}
});
}
});
});
我尝试像这样使用async 模块:
async.parallel(calls, (err, col) => {
if (err)
console.log(err);
else {
console.log(col);
res.render('admin/', {
title: 'Admin pannel',
user: req.user,
employers: col[0],
banner: col[1],
areAwaiting: col[2],
})
}
});
现在。我得到的错误是wrapAsync(...) is not a function。我尝试将我的函数放在这样的匿名函数中:
() => {
Account.find({accType: 'Employer'}, (err, col) => {
if (err)
console.log(err);
else return col;
})
}
但随后代码就冻结了。我也试过这个:
(col) => {
Banner.findOne((err, doc) => {
if (err)
console.log(err);
else return doc;
});
return col
},
但效果相同。知道我做错了什么吗?回调地狱版本有效,但丑陋且不可维护。
戴夫·米汉的回答。必须稍作修改才能使其正常工作。
router.get('/', (req, res) => {
return Promise.all([
Account.find(),
Banner.findOne(),
Account.findOne({accType: 'Awaiting'}),
]).then(([employers, banner, awaiting]) => { // Right here
if (awaiting != null)
var areAwaiting = true;
res.render('admin/', {
title: 'Admin pannel',
user: req.user,
employers: employers,
areAwaiting: areAwaiting,
banner: banner,
});
}).catch(e => {
console.error(e)
});
});
我不得不将then 中的数组关闭为()
【问题讨论】:
-
如果你在服务器端(并且你的类支持 Promises),并且有最新的 NodeJS LTS 版本可用,你可以使用原生的 async / await 语言特性。见blog.risingstack.com/mastering-async-await-in-nodejs
-
它是否适用于我的查询?所有异步文档都显示 API 调用
-
如果有一个很好的回调地狱的例子以及为什么要使用承诺链,这就是一个。切换到 Promise,而不是异步库。
-
而且,您的数据库很可能也已经支持 Promise(看起来可能是 mongodb 已经支持 Promise)。
-
我很难理解承诺链。我编辑了我的问题以包含我的试用版
标签: javascript node.js express asynchronous