如何根据提取结果调整变量

时间:2019-07-11 14:16:48

标签: javascript wordpress rest api fetch

我正在研究一个脚本,该脚本将从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。

我没有必要为我的问题寻求最终解决方案。我很乐意提出另一种建议,让我构造代码,以获得所需的结果。

谢谢!

3 个答案:

答案 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);
})()