2013-06-17 4 views
2

저는 노드에 스크레이퍼를 구현하고 있습니다.이 노드는 requestcheerio을 사용하여 페이지를로드하고 구문 분석합니다.Node.js - Cheerio에서 콜백 함수 사용

요청 후에 만 ​​콜백을 넣고 Cheerio가 페이지로드를 마쳤습니다. async extension을 사용하려고하지만 콜백을 어디에 둘 것인지 확실하지 않습니다.

request(url, function (err, resp, body) { 
    var $; 
    if (err) { 
     console.log("Error!: " + err + " using " + url); 
    } else { 
     async.series([ 
      function (callback) { 
       $ = cheerio.load(body); 
       callback(); 
      }, 
      function (callback) { 
       // do stuff with the `$` content here 
      } 
     ]); 
    } 
}); 

나는 cheerio documentation를 읽어 봤는데 내용이로드 된 경우에 대한 콜백의 예를 찾을 수 없습니다.

을 할 수있는 가장 좋은 방법은 무엇입니까? 스크립트에서 50 개의 URL을 던질 때 cheerio가 내용에 제대로로드되기 전에 너무 일찍 이동하기 시작하며 비동기 로딩으로 인한 오류를 막으려고합니다.

비동기 프로그래밍 및 콜백에 대해서는 완전히 새로운 기능이므로 여기에 간단한 내용이없는 경우 알려 주시기 바랍니다.

+1

'cheerio.load'는 내가 볼 수있는 한 동기식 메소드이므로'async'를 사용할 필요가 없습니다. '너무 일찍 움직이기 시작한다'는 것은 무엇을 의미합니까? 'request'에 대한 호출을 제한/처리하고 싶습니까? – robertklep

+0

동기식이란 무엇입니까? (나는 그것이 올바른 용어라고 생각합니다 ... 노드가 완료 될 때까지 기다릴 것입니까?) – Jascination

+0

@robertklep 또한 질문에 답하기 위해 많은 링크를 던지면서 이상한 일이 발생했습니다. URL에서 긁어 모으는 정보를 기반으로 개체를 만들었고 때로는 필드가 누락되어 종종 모든 필드가 누락되었습니다. 이 것을 막기 위해 무언가를 만들려고 노력하고 있지만, 문제는 다른 곳에있을 수 있습니다. – Jascination

답변

5

예, cheerio.load은 동기식이므로 콜백이 필요하지 않습니다.

request(url, function (err, resp, body) { 
    if (err) { 
    return console.log("Error!: " + err + " using " + url); 
    } 
    var $ = cheerio.load(body); 
    // do stuff with the `$` content here 
});