我有这个功能
/* 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
},
但是效果是一样的。知道我做错了什么吗?回调 hell 版本有效,但丑陋且不可维护。
Dave Meehan 的回答。必须对其稍作编辑才能使其正常工作。
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
中关闭数组到 ()
最佳答案
这很简单,并假设:
你正在使用 Express 或类似的路由处理程序,你可以返回一个 promise 而不是使用回调
您正在使用 Mongoose 或类似的数据库,并且可以返回一个 promise 而不是使用回调。
检查您的版本以获取 Promise 支持。
您似乎至少缺少 Banner 的一些查询参数,并且您需要弄清楚其中是否存在依赖关系,或者如图所示,它们是否可以并行运行。
router.get('/', (req, res) => {
return Promise.all([
Account.find(),
Banner.findOne(),
Account.findOne({ accType: 'Awaiting' }),
]).then(([ col, banner, doc ]) => {
res.render('admin/', {
title: 'Admin pannel',
user: req.user,
employers: col,
areAwaiting: awaiting,
banner: banner,
);
}).catch(e => { console.error(e) });
});
关于javascript - 避免 Node 中的回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49603355/