2016-11-29 4 views
1

ここに私の非常に基本的なスクリプトは、特定のURLをこすり、その中のすべてのリンクを取得します。 要求機能が完了した後にlinks_arrを印刷したいとします。しかし、ここでは要求コールバック関数が実行されるので、空の配列が出力されます。これをどのように同期させるのですか?すなわち以下の順序で行われる。Node.jsで同期的にリクエストを使用するには?

  1. URLが必要です。
  2. Cheerioはすべてのリンクを取得します。
  3. すべての項目をループしてlinks_arr配列に挿入します。
  4. アレイを印刷します。

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* 
+0

非同期待機タスクをシミュレートするライブラリが多数あります。私は数週間前に私(Awync)をリリースしました。 https://github.com/tlghn/awync –

答えて

2

です:

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行を移動し、それは次のようになります良い。

我々は非同期コードを処理する3つの方法持ってJavaScriptで

  1. コールバック
  2. 約束
  3. だから、あなたが使用するかを選択することができますし、また、混在させることができる

をベースと発電機をそれらは(あなたが使用するライブラリに依存します)。あなたはmore information hereと読むことができます。

+0

それは私がそれがそうであると思ったより簡単だった方法を見たことがあります。働いた。 –

+0

私は自分の答えを編集し、非同期コールバックに参照を追加します – Maksim

+0

本当に感謝します。ありがとう! –

1
$(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); 
     }); 
関連する問題