我有一个异步问题,其中findLabels在locateDoc之前触发,我无法理解如何处理这些异步问题。目前我只使用setTimeout
处理它router.get('/editing_station/:collection_name', function (req, res, next) {
let collectionName = req.params.collection_name.slice(1, -1)
db_trims.locateDoc(collectionName)
db_label.locateDoc(collectionName)
setTimeout(function(){
db_label.findLabels((err, labels) => {
if (err) {
return res.sendStatus(500)
}
db_trims.findTrims((err, trims_) => {
if (err) {
return res.sendStatus(500)
}
res.render('editing_stream', {name: collectionName, label: labels, trims: trims_, trim: trimName})
})
})
}, 1000);
})
我读过我不应该嵌入回叫,但是我不能把一个正常运行的异步瀑布或系列放在一起
答案 0 :(得分:1)
我不知道locateDoc
是什么以及它返回的是什么,但假设它是某个数据库调用或其他东西而且还返回Promise
您应该像这样更改代码。
router.get('/editing_station/:collection_name', async function (req, res, next) {
let collectionName = req.params.collection_name.slice(1, -1)
await db_trims.locateDoc(collectionName)
await db_label.locateDoc(collectionName)
db_label.findLabels((err, labels) => {
if (err)
return res.sendStatus(500);
db_trims.findTrims((err, trims_) => {
if (err)
return res.sendStatus(500);
res.render('editing_stream', {name: collectionName, label: labels, trims: trims_})
})
})
})
或者更好的是,如果你的回调功能支持Promise方式,你也可以这样做。
router.get('/editing_station/:collection_name', async function (req, res, next) {
let collectionName = req.params.collection_name.slice(1, -1)
try {
await db_trims.locateDoc(collectionName)
await db_label.locateDoc(collectionName)
var labels = await db_label.findLabels()
var trims_ = await db_trims.findTrims()
res.render('editing_stream', {name: collectionName, label: labels, trims: trims_})
} catch (err) {
console.log(err)
res.sendStatus(500)
}
})