我正在研究一个脚本,该脚本将从WordPress管理的网站提供的分页REST API中获取帖子。
我意识到WordPress REST API是分页的,每个请求的上限为100个对象。
在下面的代码中,我尝试逐页获取帖子,每页包含20个帖子。最后,我将所有提取的对象合并为一个大对象。
我的问题是,由于最后一个请求包含的帖子少于20个,因此提取失败并显示HTTP 404响应。
如果获取返回的是404,我想调整名为“ limitPerPage”的变量,并减小该变量,直到获得200 HTTP响应为止。
我的挑战是,我没有经历过获取承诺的工作。
请在下面查看我当前的脚本:
console.log('REST API is this: ' + apiUrl);
const getPosts = async function(pageNo = 1) {
let limitPerPage = 20;
let requestUrl = apiUrl + `?page=${pageNo}&per_page=${limitPerPage}`;
let apiResults = await fetch(requestUrl)
.then(function(response){
return response.json();
})
.catch(function(error){
console.log(error.status);
});
return apiResults;
}
const getEntirePostList = async function(pageNo = 1) {
const results = await getPosts(pageNo);
console.log('Retreiving data from API for page : ' + pageNo);
if (results.length > 0) {
return results.concat(await getEntirePostList(pageNo+1));
} else {
return results;
}
};( async () => {
const entireList = await getEntirePostList();
console.log(entireList);
})
();
如果提取返回404 HTTP响应,我希望代码将变量'limitPerPage'减1。
我没有必要为我的问题寻求最终解决方案。我很乐意提出另一种建议,让我构造代码,以获得所需的结果。
谢谢!
答案 0 :(得分:0)
我认为以下代码应该有效。始终在异步函数内使用try ... catch块
let entireList = [];
let finishEvent = new Event('finished');
document.addEventListener('finished', function (e) {
console.log(entireList);
}, false);
const getPosts = function (pageNo = 1) {
let limitPerPage = 20;
let requestUrl = `${apiUrl}?page=${pageNo}&per_page=${limitPerPage}`;
return fetch(requestUrl)
.then(function (response) {
return response.json();
})
.catch(function (error) {
console.log(error.status);
return false;
});
}
const getEntirePostList = async function (pageNo = 1) {
try {
const results = await getPosts(pageNo);
console.log('Retreiving data from API for page : ' + pageNo);
if (results && (results.length > 0)) {
entireList.concat(results);
getEntirePostList(pageNo + 1);
} else {
document.dispatchEvent(finishEvent);
}
return;
} catch(e) {
console.log(e)
}
};
getEntirePostList();
答案 1 :(得分:0)
在上述建议的帮助下,我自己设法解决了该问题。请在此处找到解决方案:
function sliceCakes(radii, people) {
let cakeSizes = radii.map(r => r * r * Math.PI);
let maxSize = 0;
new Set(cakeSizes).forEach(size => {
for (let slices = 1; slices <= people; slices++) {
if (cakeSizes.reduce((numberOfSlices, cake) => (
numberOfSlices + Math.floor(cake / (size / slices))
), 0) >= people) {
maxSize = Math.max(maxSize, size / slices);
break;
}
}
});
return maxSize;
}
document.write(sliceCakes([1, 1, 1, 2, 2, 3], 6));
上面的代码从所有分页的REST API调用返回完整的JSON响应数组。
答案 2 :(得分:-1)
您可以使用while
循环,如果状态码不是200,则递减limitPerPage
:
console.log('REST API is this: ' + apiUrl);
const getPosts = async pageNo => {
let limitPerPage = 20;
let requestUrl = apiUrl + `?page=${pageNo}&per_page=${limitPerPage}`;
let res = { status: 0 }
while (res.status !== 200) {
res = await fetch(requestUrl)
.then(r => ({ data: r.json(), status: r.status }))
.catch(({status}) => console.log(status))
limitPerPage--
}
return res.data
}
const getEntirePostList = async (pageNo = 1) => {
const results = await getPosts(pageNo);
console.log('Retreiving data from API for page : ' + pageNo);
return results.length > 0
? results.concat(await getEntirePostList(pageNo + 1))
: results;
}
(async () => {
const entireList = await getEntirePostList();
console.log(entireList);
})()