首页 > 解决方案 > 路由返回等待功能完成

问题描述

在以下代码中,路由在填充数组之前返回,因此数组返回空。我知道我在 promise 和/或 async 和 await 方面做错了,但我不知道它是什么。

router.get('/:deckId', auth.required, (req, res) => {
  Deck.findById(req.params.deckId).then(deck => {
    let cardArray = []
    deck.cards.forEach(card => {
      const url = `https://api.scryfall.com/cards/${card.id}`
      getScryFallCard(url).then(a => cardArray.push(a))
    })
    res.json({
      name: deck.name,
      id: deck._id,
      cards: cardArray
    })
  })
})

我尝试使所有函数异步并将 await 放在子函数旁边。我尝试创建一个承诺,将 await 放在该承诺旁边,然后返回响应。我尝试在猫鼬函数上使用回调而不是 Promise。我尝试了其他组合的 Promise、async、await 和回调,但没有成功。填充数组后返回响应的正确方法是什么?

这是我得到的回应。卡片键应填充一组卡片。

{
    "name": "Dovin",
    "id": "5ca50448232aa920636dd571",
    "cards": []
}

标签: node.jsexpressasynchronous

解决方案


router.get('/:deckId', auth.required, (req, res) => {
  Deck.findById(req.params.deckId).then(async deck => {
    let cardArray = []
    for (let card of deck.cards) {
      const url = `https://api.scryfall.com/cards/${card.id}`
      let a = await getScryFallCard(url)
      cardArray.push(a)
    }
    res.json({
      name: deck.name,
      id: deck._id,
      cards: cardArray
    })
  })
})

您需要res.json在执行循环中的所有代码后调用。await确保在我们完成异步作业之前不执行下一行。res.json因此,在循环内完成所有调用后发送响应( )。


推荐阅读