У меня есть несколько URL-адресов для вызова данных, и я хочу вызвать функцию после того, как они все ответили и данные были получены.

var promises = urls.map(url => fetch(url));

Promise.all(promises).then(response => {
 for (var i = 0; i < response.length; i++) {
  response[i].json().then(data => { dataReceived.push(data.rows)})
 }
 }).then(dataReceived=> {

  doThisFucntion(withAllTheData);

 });

Я уверен, что мне просто нужно добавить еще один обещание. Все (), но я не знаю, где это сделать.

Спасибо

1
Jialx 23 Фев 2018 в 05:03

3 ответа

Лучший ответ

Тебе не нужен еще один Promise.all. Просто поместите цепочку разбора тела и извлечения свойств в обратный вызов map, который у вас уже есть:

var promises = urls.map(url =>
  fetch(url).then(response => response.json()).then(data => data.rows)
);

Promise.all(promises).then(doThisFunction);
1
Bergi 23 Фев 2018 в 03:16

Попробуйте сделать тот же трюк, который вы использовали для URL. Просто возьмите каждый ответ, сопоставьте его с тем, что вы хотите, и поместите все это в Promise.all:

var promises = urls.map(url => fetch(url));

Promise.all(promises).then(response => {
    return Promise.all(response.map(resp => resp.json().then(data => data.rows)));
}).then(dataReceived => {
    // dataReceived is an array where each entry is one of the 'data.rows' from before.
    doThisFucntion(dataReceived);
});
1
CRice 23 Фев 2018 в 02:10

Может быть что-то вроде этого:

var promises = urls.map(url => fetch(url));

Promise.all(promises)
  .then(response => Promise.all(response.map(resp=>resp.json())))
  .then(data=>data.map(element=>element.rows))
  .then(dataReceived=> {    
    doThisFucntion(withAllTheData);
  });
2
Vasyl Moskalov 23 Фев 2018 в 02:10