Как передать sh данные из fetch () в массив в Javascript, используя для l oop? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь получить данные с нескольких URL-адресов, хранящихся в массиве. Каждый URL-адрес содержит данные в формате json. Я использую for l oop для перебора URL-адресов, хранящихся в массиве URL-адресов. Каждый файл json содержит интересующее меня значение travelTimeInSeconds. При выполнении следующего кода два значения, хранящиеся в переменной timeT, регистрируются в консоли. Однако массив ttTimes остается пустым. Как добиться сохранения значений в массиве ttTimes?

urls = ['www.a.com/dataa.json','www.b.com/datab.json']
ttTimes = []

function getData(url) {
    fetch(url)
    .then(response=>{
        return response.json()
    })
    .then(data =>{
        let timeT = Math.round(data['routes'][0]['summary']['travelTimeInSeconds']/60); 
        console.log(timeT)
        ttTimes.push(timeT)
    })

}

for (url in urls){
    time = getData(urls[url])
    console.log(time)
    ttTimes.push(time)
};

1 Ответ

0 голосов
/ 05 мая 2020

Массив ttTimes остается пустым, потому что вы никогда не ждете разрешения обещаний перед его проверкой. Вы можете использовать Promise.all, чтобы дождаться их всех, прежде чем проверять массив результатов.

urls = ['www.a.com/dataa.json','www.b.com/datab.json']

// This function just returns a promise
function getData(url) {
  return fetch(url)
    .then(response=>{
      return response.json()
    })
    .then(data =>{
      const timeT = Math.round(data['routes'][0]['summary']['travelTimeInSeconds']/60); 
      return Promise.resolve(timeT);
    })
}


Promise.all(
  // use the urls to create an array of promises
  urls.map(getData)
).then((ttTimes) => {
  // When all the promises have been resolved, then this will be executed
  //Here all the promises have been resolved, so you would have an array with the ttTimes
  console.log(ttTimes);
})
...