在下面的代码中,路由是在填充数组之前返回的,因此该数组返回空值。我知道我在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": []
}
答案 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.json
。 await
确保在完成异步作业之前不执行下一行。因此,响应(res.json
)是在循环内所有调用完成后发送的。