Маршрут возвращается, ожидайте, функция завершена - PullRequest
0 голосов
/ 05 апреля 2019

В следующем коде маршрут возвращается до заполнения массива, поэтому массив возвращается пустым.Я знаю, что что-то не так с обещаниями и / или асинхронностью и ожиданием, но я не могу понять, что это такое.

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.Я пробовал другие комбинации обещания, асинхронности, ожидания и обратного вызова, но безуспешно.Как правильно вернуть ответ после заполнения массива?

Это ответ, который я получаю.Ключ карты должен быть заполнен массивом карт.

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

1 Ответ

2 голосов
/ 05 апреля 2019
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) отправляется после завершения всех вызовов внутри цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...