路线返回等待功能完成

时间:2019-04-05 01:35:16

标签: node.js express asynchronous

在下面的代码中,路由是在填充数组之前返回的,因此该数组返回空值。我知道我在promise和/或异步等待中做错了事,但是我不知道这是什么。

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

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

这是我得到的答复。卡密钥应填充有一系列卡。

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

1 个答案:

答案 0 :(得分:2)

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.jsonawait确保在完成异步作业之前不执行下一行。因此,响应(res.json)是在循环内所有调用完成后发送的。