使用setTimeout的承诺不会返回json

时间:2019-03-04 21:44:01

标签: javascript json promise settimeout

由于电影数据库API的限制(每10秒40个请求)我请求的冷却时间为4秒的api数据。因此,我需要等待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 :(得分:1)

函数getAllSearchResultProfilesresponses数组解析。稍后,您尝试在此数组上执行.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);
});