«Exit обещание» с множественными запросами на выборку - PullRequest
0 голосов
/ 28 апреля 2019

Мне нужно объединить данные из API.Я делаю первый вызов к конечной точке, которая дает мне список идентификаторов, затем я делаю запрос для каждого идентификатора.Моя цель - вернуть список с ответами на все запросы, но я потерял себя в обещаниях ...

Мой код работает на NodeJS.Вот код:

const fetch = require('node-fetch')

const main = (req, res) => {
  fetch('ENDPOINT_THAT_GIVES_LIST_OF_IDS')
  .then(response => response.json())
  .then(response => {
    parseIds(response)
  .then(data => {
    console.log(data)
    res.json(data)
    // I want data contains the list of responses
  })
})
.catch(error => console.error(error))
}

const getAdditionalInformations = async function(id) {
  let response = await fetch('CUSTOM_URL&q='+id, {
    method: 'GET',
  });
  response = await response.json();
  return response
}

const parseIds = (async raw_ids=> {
  let ids= []
  raw_ids.forEach(function(raw_id) {
    let informations = {
      // Object with data from the first request  
    }
    let additionalInformations = await 
getAdditionalInformations(raw_id['id'])
    let merged = {...informations, ...additionalInformations}
    ids.push(merged)
  })
  return ids
})

main()

Я получаю эту ошибку: «await действителен только в асинхронной функции» для этой строки:

let additionalInformations = await getAdditionalInformations(raw_id['id'])

Помогите мне с обещанием и async / await, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Вам не хватает асинхронного после forEach

const parseIds = (async raw_ids=> {
  let ids= []
  raw_ids.forEach(async function(raw_id) {
    let informations = {
      // Object with data from the first request  
    }
    let additionalInformations = await 
getAdditionalInformations(raw_id['id'])
    let merged = {...informations, ...additionalInformations}
    ids.push(merged)
  })
  return ids
})

Одно предложение: вы смешиваете обещания (.then ()) с async / await. Предпочитайте async / await более читабельно.

Обратите внимание, что getAdditionalInformations внутри forEach не ждет, пока это будет сделано, прежде чем перейти к следующей записи массива.

Вы можете использовать обычный старый для (var i = 0; .... вместо

0 голосов
/ 28 апреля 2019

Вы почти на месте, только небольшая ошибка здесь с вашими скобками:

// notice the parentheses'
const parseIds = async (raw_ids) => {
  let ids= []
  raw_ids.forEach(function(raw_id) {
    let informations = {
      // Object with data from the first request  
    }
    let additionalInformations = await getAdditionalInformations(raw_id['id'])
    let merged = {...informations, ...additionalInformations}
    ids.push(merged)
  })
  return ids
}
...