由于电影数据库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();
答案 0 :(得分:1)
函数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);
});