Обещание с setTimeout не возвращает JSON - PullRequest
0 голосов
/ 05 марта 2019

Из-за ограничения API базы данных фильмов (40 запросов каждые 10 секунд) я запрашиваю данные API, время восстановления которых составляет 4 секунды.Итак, мне нужно подождать 4 секунды до разрешения следующего обещания.

Я понимаю, что мне нужно обернуть setTimeout в Promise, но как конвертировать URL ответа в json?

Мой неудачный подход:

const pages_Array = [1, 2, 3, 4, 5];

let getSearchResultsForOnePage = url => {
  //fetch
  return fetch(url);
};

let pause = time => {
  // handy pause function to await
  return new Promise(resolve => setTimeout(resolve, time));
};

let getAllSearchResultProfiles = async searchURL => {
  let URLs = [];
  for (let i = 0; i < pages_Array.length; i++) {
    URLs.push(searchURL + pages_Array[i]);
  }
  console.log(URLs);
  let responses = [];
  for (url of URLs) {
    console.log("sending request");
    response = await getSearchResultsForOnePage(url);
    console.log("received", response);
    console.log(typeof response)
    responses.push(response);
    await pause(4000);
  }

  return responses;
};

let getAllIDs = () => {
  getAllSearchResultProfiles(mainURL).then(response => {
    data = response.json();
    console.log(data);
  });
};

getAllIDs();

1 Ответ

0 голосов
/ 05 марта 2019

Функция getAllSearchResultProfiles разрешается с массивом responses.Позже вы пытаетесь сделать .json() для этого массива, но это не работает;Вы должны сделать .json() для каждого отдельного элемента в массиве.Это может выглядеть примерно так:

getAllSearchResultProfiles(mainURL).then(responses => {
  const jsonBodies = responses.map(response => response.json());
});

Но поскольку .json() само возвращает обещание (то есть обещание, которое разрешается после получения и анализа всего тела HTTP как JSON), вместо этого можно использовать .json() изнутри вашей getAllSearchResultProfiles функции.(В противном случае вам придется использовать Promise.all.)

Так что вместо того, чтобы делать responses.push(response) внутри цикла for, вы должны сделать responses.push(await response.json()).Таким образом, ответ JSON помещается прямо в массив responses, и вы можете использовать его как есть в .then():

getAllSearchResultProfiles(mainURL).then(data => {
  console.log(data);
});
...