Извлекать в извлечении в oop JS - PullRequest
0 голосов
/ 16 марта 2020

Вопрос в том, как я могу избавиться от второго вызова 300 раз? Или есть другой способ сделать это, чем я занимаюсь? Кроме того, как сделать заказанные (не хочу сортировать) вызовы первого API, потому что они поступают из API в хаотическом c асинхронном режиме?

for(let i=1;i<=300; i++) {
  fetch(`example.api/incomes/${i}`)   // should be returned 300 times
    .then(response => {
      if(response.ok) return response.json();
      throw new Error(response.statusText);
    })
    .then(function handleData(data) {
        return fetch('example.api')   // should be returned 1 time
        .then(response => {
            if(response.ok) return response.json();
            throw new Error(response.statusText);
          })
    })
    .catch(function handleError(error) {
        console.log("Error" +error);            
    }); 
};

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете решить это, используя Promise all.

let promises = [];
for (let i = 1; i <= 300; i++) {
  promises.push(fetch(`example.api/incomes/${i}`));
}
Promise.all(promises)
  .then(function handleData(data) {
    return fetch("example.api") // should be returned 1 time
      .then(response => {
        if (response.ok) return response.json();
        throw new Error(response.statusText);
      });
  })
  .catch(function handleError(error) {
    console.log("Error" + error);
  });
0 голосов
/ 16 марта 2020

Храните все ваши запросы в массиве. Затем используйте Promise.all() ожидание всех этих запросов до sh. Затем, когда все запросы будут завершены, используйте другой Promise.all() с map() внутри него, чтобы вернуть JSON каждого запроса и дождаться, пока все они завершатся sh.

Теперь ваш аргумент data будет иметь массив объектов, доступных в следующем then обратном вызове.

function fetch300Times() {
  let responses = [];
  for(let i = 1; i <= 300; i++) {.
    let response = fetch(`example.api/incomes/${i}`);
    responses.push(response);
  } 
  return Promise.all(responses);
}

const awaitJson = (response) => Promise.all(responses.map(response => {
  if(response.ok) return response.json();
  throw new Error(response.statusText);
}));

fetch300Times()
  .then(awaitJson)
  .then(data => {
    fetch('example.api')   // should be returned 1 time
      .then(response => {
        if(response.ok) return response.json();
        throw new Error(response.statusText);
      });
  }).catch(function handleError(error) {
    console.log("Error" +error);            
  });  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...