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

这是我的基本脚本来刮一个给定的url,并获得其中的所有链接。 我想在请求函数完成后打印links_arr 。 但是,在这里请求callback函数被执行,所以,我得到一个空的数组打印。 我如何做到这一点同步? 即按以下顺序。

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

PS我知道Node.js意味着asynchronous任务,但这是我需要履行的要求。 我看过Promise这样的东西可以帮助我,但是由于Node没有先进的知识,我不知道如何实现。 一些帮助将不胜感激。 我正在使用http请求的请求库,URLparsingurl和Cheerio的HTMLparsing。

 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. ie 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); 里面的callback函数:

 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. ie After the array is filled. }); } 

所以只要将这个陈述排成一行就可以了。

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

  1. callback
  2. 许诺
  3. 发电机为主

所以你可以select使用哪一个,也可以混合使用(例如,取决于你使用的库)。 您可以在这里阅读更多信息 。

 $(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); });