2017-08-20 1 views
0

Je fais une demande qui renvoie les données paginés, donc je veux appeler une fonction récursive jusqu'à ce que j'ai toutes les pages de données, comme suit:Comment revenir promesse la chaîne après récursion

router.get("/", (req, res) => { 
    doRequest(1, []) 
     .then(result => { 
      res.status(200).send(result); 
     }) 
     .catch(error => { 
      console.error(error); 
      res.status(500).send("Error from request"); 
     }); 
}); 

function doRequest(page, list){ 
    let options = { 
     uri : "www.example.com", 
     qs : { "page" : page } 
    }; 
    request(options) 
     .then((results) => { 
      list.push(results); 
      if(page === 2){ 
       return Promise.resolve(list); 
      } else { 
       return doRequest(++page, list); 
      } 
     }) 
     .catch((error) => { 
      return Promise.reject(error); 
     }); 
} 

Mon itinéraire revient immédiatement avec Cannot read property 'then' of undefined, donc doRequest() renvoie apparemment undefined tout de suite, plutôt que de retourner la liste quand il est prêt. Je suis nouveau pour les promesses, donc je suis sûr qu'il me manque quelque chose de très simple.

+4

'doRequest' ne renvoie rien ... vouliez-vous dire' return request' dans 'doRequest' pour retourner une Promesse que vous pouvez' .then'? –

Répondre

0

Modifier la fonction doRequest à

function doRequest(page, list){ 
    let options = { 
     uri : "www.example.com", 
     qs : { "page" : page } 
    }; 
    return request(options) 
     .then((results) => { 
      list.push(results); 
      if(page === 2){ 
       return Promise.resolve(list); 
      } else { 
       return doRequest(++page, list); 
      } 
     }) 
     .catch((error) => { 
      return Promise.reject(error); 
     }); 
} 

il peut retourner la demande, le rendement en fait rien (undefined)

+0

Oui, merci. Je me suis tellement pris dans la récursion étant le problème que j'ai raté l'évidence! – Carasel

+0

ouais, bienvenue mec :) –

0

En effet doRequest retourne « undefined » puisque la fonction ne retourne rien. Les instructions de retour que vous avez là appartiennent aux prédicats de 'then' et de 'catch', mais vous n'en avez pas dans la fonction doRequest.

Vous devez retourner le résultat de « demande » qui devrait être une promesse, de sorte que votre code doit d'ailleurs que je ne pense pas comme ça

function doRequest(page, list){ 
let options = { 
    uri : "www.example.com", 
    qs : { "page" : page } 
}; 
return request(options) 
    .then((results) => { 
     list.push(results); 
     if(page === 2){ 
      return Promise.resolve(list); 
     } else { 
      return doRequest(++page, list); 
     } 
    }) 
    .catch((error) => { 
     return Promise.reject(error); 
    }); 

}

est une bonne approche pour gérer cela récursivement, mais c'est probablement une autre discussion.