Voici mon exemple de code:
function recursiveFetch(num) { // EXAMPLE that recursivley fetches all todos from example API return new Promise(resolve => { fetch("https://jsonplaceholder.typicode.com/todos/" + num) .then((response) => { return response.json(); }) .then((data) => { if (num == 0) { console.log("Done getting TODOs"); resolve(num); } else { recursiveFetch(num - 1); } }); }); } new Promise(resolve => { // Just using this for this example resolve(10); }) .then((num) => { // This runs fine and returns a promise which is eventually resolved return recursiveFetch(num); }) .then((num) => { // This never happens? console.log("num is now " + num); })
3 Réponses :
Vous devez retourner la récursoirfetch dans la promesse interne
Pour corriger votre code tel qu'il est, vous avez besoin
async function fetchAll(num) { let data = []; for (let i = 1; i <= num; i++) { let t = await fetch("https://jsonplaceholder.typicode.com/todos/" + i); data.push(await t.json()) } return data; } Promise .resolve(3) .then(fetchAll) .then(console.log)
Vous devez ajouter une résolution à l'intérieur de «autre» lorsque vous appelez de la fonction de la fonction «RécursiveFecTH». Étant donné que la fonction renvoie une autre promesse que vous devez résoudre puis, sinon il quittera immédiatement.
Je l'ai essayé et cela fonctionne: P>
function recursiveFetch(num) { // EXAMPLE that recursivley fetches all todos from example API return new Promise(resolve => { fetch("https://jsonplaceholder.typicode.com/todos/" + num) .then((response) => { return response.json(); }) .then((data) => { if (num == 0) { console.log("Done getting TODOs"); resolve(num); } else { resolve(recursiveFetch(num - 1)); } }); }); } new Promise(resolve => { // Just using this for this example resolve(10); }) .then((num) => { // This runs fine and returns a promise which is eventually resolved return recursiveFetch(num); }) .then((num) => { // This never happens? console.log("num is now " + num); })
Essayez d'ajouter un
.Catch code> pour voir s'il y a des erreurs. (Aussi, mieux pour éviter la promesse explicite de la construction antiparatère). Vous n'appelez pas non plus
résoudre code> dans le
sinon code>, la promesse sera suspendue pour toujours dans ce cas
Il n'est pas nécessaire de créer une nouvelle promesse avec
Fetch code>
@ Daniela.white si je supprimais la nouvelle promesse code> ligne code> et le
résolve code>, je reçois cette sortie:
num est maintenant non défini code>
Todos code>, comme s'il ne fait que sauter le fait que c'est une promesse
Oui, selon avec Daniel A. White ...
Fetch code> est une promesse Par défaut ... Il n'est pas nécessaire de faire une promesse d'une autre promesse.
Il suffit de garder
retour code> ing