2017-05-24 126 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'文档以查看返回的内容(它返回带有状态码,正文,头文件等的响应对象),或者只是使用带有断点的调试器。 –