在以下代码中,路由在填充数组之前返回,因此数组返回空。我知道我在 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 放在该承诺旁边,然后返回响应。我试过在 mongoose 函数上使用回调而不是 Promise。我已经尝试了 promise、async、await 和回调的其他组合,但都没有成功。填充数组后返回响应的正确方法是什么?
这是我得到的回应。卡片密钥应填充一系列卡片。
{
"name": "Dovin",
"id": "5ca50448232aa920636dd571",
"cards": []
}
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
在循环内完成所有调用后发送响应()。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句