2017-04-01 1 views
0

Je souhaite demander plusieurs pages avec request dans async.forEach. J'ai plusieurs links, et je veux aller à chaque lien et obtenir le sublinks à partir de celui-ci. Ensuite, je veux évaluer chaque sous-lien et pousser les résultats à dataarray. Mais seul le premier sublink est évalué plusieurs fois, pour chaque élément de tableau links. Mais je veux évaluer chaque sublink. Voici mon code:Les demandes ne sont pas évaluées correctement dans async.forEach

var dataarray = []; 
var links = ["www.mysite.com/1","www.mysite.com/2","www.mysite.com/3"]; 

async.whilst(
    function() { console.log("Number of links left: " + links.length); return links.length > 0; }, 
    function(innerCallback){ 
     var i1 = getRandomInt(1, links.length); //getRandomInt is a function that gives a random integer in array. 
     var Theurl = links[i1-1]; 
     request({ 
      url: Theurl, 
      //More paramaters to request here... 
     }, function(error, response, body) {   
      if (response) { 
       //Evaluate some jquery to get a variable allsublinks used later on. 
       //So I get several sub-links in each element in links array. 
       var allsublinks = stuff; 

       //Now I define a function to be used in async.forEach. I basically need to 
       //loop over allsublinks array that contains different url links. 
       function getInfo(name, thiscallback) { 
        console.log("Online"); 
        console.log("Current url: "+name);   
        request({ 
        url: name, 
        //Other parameters to request. 
        }, function(error, response, body) { 
         if (response) { 
         //Here I evaluate some jquery again to get the datafromthislink variable 
         dataarray.push(datafromthislink); 
         setTimeout(function() { thiscallback(); });               
        } 
        }) 
       } 

       //Now I use async.forEach to loop over allstorelinks. 
       async.forEach(allsublinks, getInfo, function(err, results) { 
        console.log("dataarray: ",dataarray); 
        setTimeout(function() { links.splice(i1-1, 1); innerCallback(); }); 
       }); 
      } 
     }) 
    }, 
    function(err){ 
     console.log("All Done"); 
}) 

Qu'est-ce que je fais mal?

Cordialement

+0

Pourquoi utilisez-vous alors que pour les liens? 'async.each (liens, fonction (lien, callback) {' vous auriez sauvé beaucoup d'ennuis.) Pas sûr, mais probablement le problème est quelque part dans la partie while –

+0

utilisez la fonction de fermeture –

+0

@AlokDeshwal S'il vous plaît écrivez une réponse? :) – user1665355

Répondre

0

Cela pourrait être la version propre de ce que vous essayez d'atteindre, ce qui efface votre concept d'utilisation callbacks correctement.

var dataarray = []; 
var links = ["www.mysite.com/1", "www.mysite.com/2", "www.mysite.com/3"]; 

//Now I define a function to be used in async.forEach. I basically need to 
//loop over allsublinks array that contains different url links. 
function getInfo(link, infoCallback) { 
    console.log("Online"); 
    console.log("Current url: " + link); 
    request({ 
     url: link, 
     //Other parameters to request. 
    }, function (error, response, body) { 
     if (error) console.log(error); 
     if (response) { 
      //Here I evaluate some jquery again to get the datafromthislink variable 
      dataarray.push(body.datafromthislink); 
     } 
     infoCallback(); 
    }) 
} 

function getLink(link, linkCallback) { 
    console.log('checking link: ' + link); 
    request({ 
     url: link, 
     //More paramaters to request here... 
    }, function (error, response, body) { 
     if (error) console.log(error); 
     if (response) { 
      //Evaluate some jquery to get a variable allsublinks used later on. 
      //So I get several sub-links in each element in links array. 
      var allsublinks = body.stuff; 
      //Now I use async.forEach to loop over allstorelinks. 
      async.forEach(allsublinks, getInfo, linkCallback); 
     } else { 
      linkCallback(); 
     } 
    }) 
} 

async.each(links, getLink, function (err) { 
    if (error) console.log(error); 
    console.log("All Done"); 
    console.log(dataarray); 
});