2016-11-29 2 views
1

다음은 주어진 URL을 긁어내어 모든 링크를 가져 오는 아주 기본적인 스크립트입니다. 요청 기능이 완료된 후 links_arr을 인쇄하려고합니다. 하지만, 여기에 요청 콜백 함수가 실행되고 있으므로 빈 배열이 인쇄됩니다. 이 작업을 동 기적으로 어떻게 수행합니까? 즉 다음의 순서로 진행된다.Node.js에서 요청을 동 기적으로 사용하는 방법은 무엇입니까?

  1. URL을 요청합니다.
  2. Cheerio가 모든 링크를 가져옵니다.
  3. 모든 항목을 반복하여 links_arr 배열에 삽입합니다.
  4. 배열을 인쇄하십시오.

P. 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 가지 방법이 있습니다

  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); 
     }); 
관련 문제