2017-05-24 124 views
-1

我是node.js.Learning異步庫的新手,目前我有一些urls.For每個網址,我必須提出一個請求,並從該網站,我會得到它從HTML頁面的超鏈接。所以我們必須用Node.js的request.js模塊遞歸地進行調用。在node.js中遞歸地調用異步函數

var urls=["http://www.a.com","http://www.b.com"]; 

function getUrls(url,cb){ 

    request(url,function(error,response,body){ 

     if(response && response.statusCode==200) 
     { 


     } 

     cb(); 
    }); 
} 

function startProcess(urls){ 

    async.map(urls,getUrls,function(error,data){ 

    }) 

} 
startProcess(urls); 

在getUrls功能,我呼籲每個時間每個url.When我從response.I得到html頁面數據正在刮從該頁面also..I要調用的URL請求函數「請求」功能對於這些網址也是遞歸的。

可以不使用async.map函數嗎?

+1

請仔細指定,您想在哪裏「繼續」。什麼不正確? –

+0

@SergeyYarotskiy編輯了qquestion –

回答

0

你不行。迭代後你會得到堆棧溢出。你應該做什麼來解決這個任務,就是維護你想要抓取的URL的隊列。然後在每個成功的響應中向該隊列添加新的url。類似這樣的:

let queue = ['https://some.start.point.net']; 
const concurrency = 5; 
let activeThreads = 0 

async function scraper(url) { 
    activeThreads++; 
    const body = await request.get(url); 
    const urls = // parse body here 
    for (const url of urls) queue.push(url); 
    activeThreads--; 
} 

setInterval(() => { 
    if (activeThreads < concurrency && queue.length) scraper(queue.shift()); 
}, 10) 
+0

謝謝...你能否給我提供一些很好的鏈接,以更好地解釋異步函數並等待? –

+0

我沒有在request.get(url)的返回html body ...我怎樣才能得到html的身體...在此先感謝 –

+0

問關於異步/等待的不同問題。同時檢查'request'文檔以查看返回的內容(它返回帶有狀態碼,正文,頭文件等的響應對象),或者只是使用帶有斷點的調試器。 –