Node.js 返回使用nodejs抓取网页的URL

Node.js 返回使用nodejs抓取网页的URL,node.js,scope,request,web-scraping,cheerio,Node.js,Scope,Request,Web Scraping,Cheerio,我正在尝试使用nodejs及其两个模块request和cheerio构建一个简单的web应用程序 我通过以下代码实现了这一点: var printURL=function(url){ request(url, (function() { return function(err, resp, body) { if (err) throw err; $ = cheerio.load(bod

我正在尝试使用nodejs及其两个模块request和cheerio构建一个简单的web应用程序

我通过以下代码实现了这一点:

    var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);

            $('img').each(function(){
                console.log($(this).attr('src'));
            });

        }
    } )());
};
在网站上打印图片的URL效果很好,但我真正想做的是创建一个URL列表,我可以在功能之外使用它。我试过这样做,但它返回一个空列表:

var urlList=[];     
var printURL=function(url){
        request(url, (function() {
            return function(err, resp, body) {
                if (err)
                    throw err;
                $ = cheerio.load(body);

                $('img').each(function(){
                    urlList.push($(this).attr('src'));
                });

            }
        } )());
    };

我怎样才能解决这个问题?非常感谢

您需要等待所有回调完成

var urlList=[];     
var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);
            var images = $('img');
            var counter = images.length;
            images.each(function(){
                urlList.push($(this).attr('src'));
                counter--;
                if (counter==0) {
                    // now we have all images!!
                    console.log(urlList);
                }
            });

        }
    })());
};

这是node.js异步特性的一部分。如果事情变得更复杂,我建议您使用流控制库,如。

代码运行良好,非常感谢!然而,我不确定我是如何理解它的工作原理的。你能把逻辑引导得更进一步一点吗?多谢了,代码并没有按照您写下的顺序执行。异步函数在节点完成它必须完成的任务时调用。您可以在此处找到一些有用的链接: