ここに私の非常に基本的なスクリプトは、特定のURLをこすり、その中のすべてのリンクを取得します。 要求機能が完了した後にlinks_arr
を印刷したいとします。しかし、ここでは要求コールバック関数が実行されるので、空の配列が出力されます。これをどのように同期させるのですか?すなわち以下の順序で行われる。Node.jsで同期的にリクエストを使用するには?
- URLが必要です。
- Cheerioはすべてのリンクを取得します。
- すべての項目をループしてlinks_arr配列に挿入します。
- アレイを印刷します。
P.S.私はNode.jsが非同期タスクのためのものであることを知っていますが、これは私が達成する必要がある要件です。私はこれで私を助けることができる約束のようなものがあることを読んだが、私はノードに高度な知識を持っていないので、それを実装する方法を知らない。助けていただければ幸いです。 私はhttpリクエストのためにRequestライブラリを使用しています。url解析にはurl、html解析にはcheerioです。
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);
上記のスクリプトの出力は、あなたは、コールバック関数内console.log(links_arr);
を配置する必要があり
Analysing URL https://www.npmjs.com
Scraping all links from URL https://www.npmjs.com/
[]
...
*All the other links found*
非同期待機タスクをシミュレートするライブラリが多数あります。私は数週間前に私(Awync)をリリースしました。 https://github.com/tlghn/awync –