2017-04-01 21 views
0

requestの複数のページをasync.forEachに入力したいと考えています。私はいくつかのlinksを持っていて、私は各リンクに行き、それからsublinksを得たいと思う。次に、各サブリンクを評価し、結果をdataarrayにプッシュします。しかし、sublinkの最初の1つだけが、配列の要素であるlinksごとに複数回評価されます。しかし、それぞれsublinkを評価したいと思います。以下は私のコードです:リクエストは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"); 
}) 

私は間違っていますか?

よろしく

+0

なぜリンクを使用していますか? –

+0

閉鎖機能を使用する –

+0

@AlokDeshwal答えを書いてください。どうすればいいですか? :) – user1665355

答えて

0

これは、適切にコールバックを使用してのあなたの概念をクリアしている、あなたが達成しようとしているもののクリーンバージョンである可能性があります。

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); 
}); 
関連する問題