0
votes

Comment ajuster la variable basée sur le résultat de l'extraction

Je travaille sur un script qui va chercher des postes d'une API de repos pisné fournie par un site Web géré par WordPress.

Ce que j'ai réalisé était que l'API de repos WordPress est paginé et obtenu un capuchon de 100 objets par demande.

Dans le code ci-dessous, j'essaie de récupérer la page des messages par page et avec un montant de 20 messages par page. En fin de compte, je rejoint tous les objets récupérés dans un gros objet.

Mon problème est que l'extraction échoue avec la réponse HTTP 404, puisque la dernière demande contient moins de 20 postes.

J'aimerais ajuster la variable nommée «LIVERPERPAGE», si la récupération de la récupération avec un 404 et décrémentez la variable jusqu'à ce que je reçoive une réponse de 200 HTTP.

Mon défi est que je n'ai pas expérimenté de travailler avec la promesse de récupération.

S'il vous plaît voir mon script actuel ci-dessous: xxx

i Attendez-vous à ce que le code décrémente la variable 'LIXTPERPAGE' par 1, si la récupération de la récupération de la variable de 404.

Je ne demande pas de solution finale à mon problème. J'apprécierais une suggestion à une autre façon pour moi de structurer mon code, d'obtenir le résultat dont j'ai besoin.

Merci!


1 commentaires

Le code d'état est dans réponse.status dans votre extraire () rappel


3 Réponses :


-1
votes

Vous pouvez utiliser un pendant code> boucle et décrémenter limitperpage code> si le code d'état n'est pas 200:

p>

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


0 commentaires

0
votes

Je pense que le code suivant devrait fonctionner. Toujours utiliser Essayez ... Catch Block à l'intérieur des fonctions ASYNC

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();


0 commentaires

0
votes

J'ai réussi à résoudre le problème moi-même avec l'aide des suggestions ci-dessus. Veuillez trouver la solution ici: xxx

Le code ci-dessus renvoie un tableau complet de la réponse JSON de tous les appels API de repos paginé.


0 commentaires