Javascript与mongoDB函数的异步问题

时间:2018-01-24 04:20:29

标签: javascript asynchronous

我有一个异步问题,其中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);
})

我读过我不应该嵌入回叫,但是我不能把一个正常运行的异步瀑布或系列放在一起

1 个答案:

答案 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)
    }
})