繁体   English   中英

如何在Node.js中同步使用请求?

[英]How to use request synchronously in Node.js?

这是我的基本脚本,用于抓取给定的URL并获取其中的所有链接。 我想在请求函数完成后打印links_arr 但是,这里执行请求回调函数,因此,我打印出一个空数组。 我如何同步这样做? 即按以下顺序。

  1. 请求URL。
  2. Cheerio获得所有链接。
  3. 我们遍历所有项目,并将它们插入到links_arr数组中。
  4. 打印阵列。

PS我知道Node.js意味着异步任务,但这是我需要实现的要求。 我读到像Promises这样的东西可以帮助我,但是,由于我没有Node的高级知识,我不知道如何实现它。 一些帮助将非常感激。 我正在使用请求库来进行http请求,使用url进行url解析,使用cheerio进行html解析。

var request = require('request');
var cheerio = require('cheerio');
var url = require('url');
var all_links = [];
var processing = [];
var processed = [];
var base_url = "https://www.npmjs.com";
var base_host = "www.npmjs.com";


var analyze_href_sync = function(u){
    console.log("Analysing URL "+u);
    url_obj = url.parse(u);
    url_formatted = url.format(url_obj);
    if (!url_obj.host) {
        //Relative URL
        resolved_url = url.resolve(base_url, url_formatted);
        return resolved_url;
    } else if (url_obj.protocol.startsWith("http")){
        if (url_obj.host == base_host) {
            return url_formatted;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

var scrape_all_links_sync = function(u){
    console.log("Scraping all links from URL "+u);
    var links_arr = [];
    request(u, function(err, res, body){
        $ = cheerio.load(body);
        links = $('a');
        $(links).each(function(i, link){
            href = $(link).attr('href');
            console.log(href);
            links_arr.push(href);
        });
    });

    console.log(links_arr); //Need to print this, after the above request loopo is complete. i.e. After the array is filled.
}

var store_into_csv_sync = function(u){

}

var insert_into_processing_sync = function(u){

}

var remove_from_processing_sync = function(u){

}

var main = function(u){
    var analyze_url = analyze_href_sync(u);
    if (analyze_url != false) {
        scrape_all_links_sync(analyze_url);
    }
}

main(base_url);

上面脚本的输出是

Analysing URL https://www.npmjs.com
Scraping all links from URL https://www.npmjs.com/
[]
...
*All the other links found*

你需要把console.log(links_arr); 在回调函数内:

var scrape_all_links_sync = function(u){
console.log("Scraping all links from URL "+u);
var links_arr = [];
request(u, function(err, res, body){
    $ = cheerio.load(body);
    links = $('a');
    $(links).each(function(i, link){
        href = $(link).attr('href');
        console.log(href);
        links_arr.push(href);
    });
    console.log(links_arr); //Need to print this, after the above request loop is complete. i.e. After the array is filled.
  });
}

所以只需在声明中移动1行就可以了。

在JavaScript中,我们有3种处理异步代码的方法:

  1. 回调
  2. 许诺
  3. 基于发电机

因此,您可以选择使用哪一个,也可以混合它们(例如,取决于您使用的库)。 您可以在此处阅读更多信息

$(links).each(function(i, link){
            href = $(link).attr('href');
            console.log(href);
            links_arr.push(href);
     if(i==links.length-1)
        console.log(links_arr);  
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM