2017-05-24 11 views
-1

私はnode.js.Learning非同期ライブラリを使い慣れていますが、現在私はurlの配列を持っています。各URLに対して、私はいくつかのウェブサイトにリクエストをしなければなりません。 HTMLページからのそのハイパーリンク。Node.jsのrequest.jsモジュールで再帰的に呼び出しを行う必要があります。node.jsで再帰的にasync関数を呼び出す

var urls=["http://www.a.com","http://www.b.com"]; 

function getUrls(url,cb){ 

    request(url,function(error,response,body){ 

     if(response && response.statusCode==200) 
     { 


     } 

     cb(); 
    }); 
} 

function startProcess(urls){ 

    async.map(urls,getUrls,function(error,data){ 

    }) 

} 
startProcess(urls); 

getUrls機能では、私は、要求機能ごとurl.Whenため毎回私はalso..Iを呼びたい、そのページからURLを掻き落としていますresponse.IからHTMLページデータを取得しています「要求」機能と呼ばれていますそれらのURLのためにも再帰的に。

async.map機能なしでも実行できますか?

+1

ここで、「進めてください」としてください。何が正確に動作しないのですか? –

+0

@ SergeyYarotskiy qquestionを編集しました –

答えて

0

できません。あなたはいくつかの反復の後にスタックのオーバーフローを取得します。このタスクを解決するために何をすべきかは、あなたが掻きたいと思うURLの待ち行列を維持することです。その後、成功した応答ごとにこのURLに新しいURLを追加します。このようなもの:

let queue = ['https://some.start.point.net']; 
const concurrency = 5; 
let activeThreads = 0 

async function scraper(url) { 
    activeThreads++; 
    const body = await request.get(url); 
    const urls = // parse body here 
    for (const url of urls) queue.push(url); 
    activeThreads--; 
} 

setInterval(() => { 
    if (activeThreads < concurrency && queue.length) scraper(queue.shift()); 
}, 10) 
+0

おかげさまで、非同期関数の説明のための良いリンクを私に提供できますか? –

+0

私はrequest.get(url)の代わりにhtml本文を取得していません...どうすればhtml本文を取得できますか...事前に感謝 –

+0

async/awaitについて質問する。また、 'request'ドキュメントをチェックして返されたもの(ステータスコード、ボディ、ヘッダーなどを含むレスポンスオブジェクトを返します)を参照するか、ブレークポイント付きのデバッガを使用してください。 –

関連する問題