2017-09-07 3 views
1

J'ai vérifié quelques threads dans StackOverflow, mais rien ne fonctionne pour moi. J'ai cet appel de demande et je besoin d'essayer d'envoyer la demande jusqu'à ce qu'il réussisse (mais si elle échoue, il doit attendre au moins 3 secondes):Comment répéter une "demande" jusqu'au succès? NODEJS

sortingKeywords.sortVerifiedPhrase = function(phrase) { 

    var URL = "an API URL"+phrase; //<== Obviously that in my program it has an actual API URL 
    request(URL, function(error, response, body) { 
     if(!error && response.statusCode == 200) { 
      var keyword = JSON.parse(body); 
      if(sortingKeywords.isKeyMeetRequirements(keyword)){ //Check if the data is up to a certain criteria 
       sortingKeywords.addKeyToKeywordsCollection(keyword); //Adding to the DB 
      } else { 
       console.log("doesn't meet rquirement"); 
      } 
     } else { 
      console.log(phrase); 
      console.log("Error: "+ error); 
     } 

    }); 
}; 

est ici la partie bizarre, si je l'appelle les mêmes phrases dans une rangée du navigateur, cela fonctionne presque sans erreurs (il indique habituellement: le temps limite de taux esceeded).

Appréciez votre aide. Merci d'avance.

Répondre

1

Voici un programme de travail que j'ai écrit pour cette requête. Il envoie la requête via une fonction, si la requête échoue, il renvoie le gestionnaire error et appelle à nouveau la fonction.

Si la fonction réussit, le programme renvoie une promesse et arrête l'exécution.

NOTE: si vous entrez une url invalide les programmes se termine tout de suite, c'est quelque chose qui a à voir avec le module request, que j'aime être honnête. Cela vous permet de savoir que vous avez une URL invalide. Donc, vous devez inclure https:// ou http:// dans l'url

var request = require('request'); 

var myReq; 
//our request function 
function sendTheReq(){ 
    myReq = request.get({ 
    url: 'http://www.google.com/', 
    json: true 
    }, (err, res, data) => { 
    if (err) { 
     console.log('Error:', err) 
    } else if (res.statusCode !== 200) { 
     console.log('Status:', res.statusCode) 
    } else { 
     // data is already parsed as JSON: 
     //console.log(data); 
    } 
    }) 
} 

sendTheReq(); 

//promise function 
function resolveWhenDone(x) { 
    return new Promise(resolve => { 
    myReq.on('end', function(){ 
     resolve(x) 
    }) 
    myReq.on('error', function(err){ 
     console.log('there was an error: ---Trying again'); 
     sendTheReq(); //sending the request again 
     f1();   //starting the promise again 
    }) 
    }); 
} 

//success handler 
async function f1() { 
    var x = await resolveWhenDone(100); 
    if(x == 100){ 
     console.log("request has been completed"); 
     //handle other stuff 
    } 
} 

f1();