node.js - 路由返回等待功能完成
问题描述
在以下代码中,路由在填充数组之前返回,因此数组返回空。我知道我在 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": []
}
解决方案
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
因此,在循环内完成所有调用后发送响应( )。
推荐阅读
- javascript - 了解javascript中的几行代码?
- typescript - 打字机生成的类中的自定义代码
- c++ - 具有引用数据成员的结构不是文字类型吗?
- javascript - 使用 src 和 alt 替换图像
- android - Rxjava:observeOn 影响观察者的处置逻辑
- android - Android Studio 设置问题
- c++ - 在 Vx675 中以更大的文本大小显示文本
- java - 使用 readEntity() 解析具有不同标签名称的 Json 响应
- sql - 跨多个表格式化日期
- android - 带有 RecycleView 的 Android MVVM 和共享元素转换