2015-01-02 2 views
0

URL의 배열을 node.js에서이 함수에 전달하려고합니다. 실제로 함수에 전달하기 전에 URL을 반복하는 것으로 보입니다. 함수를 호출하는 코드는 다음과 같습니다.함수가 루프를 완성하지 못했습니다.

async.eachSeries(validDatesArr, 
    function(validDatesArrItem, callback){ 
    var newMonth = validDatesArrItem.getMonth()+1; 
    loadPage(baseURL+'/month='+newMonth+'&day='+validDatesArrItem.getDate()+'&year='+validDatesArrItem.getFullYear(),function(data){ 
     loopThroughData(data, function(){ 
      var d = validDatesArr[count]; 
      d.setDate(d.getDate() + 1); 
      validDatesArr.push(d); 
      count++; 
      callback(); 
     }); 
    }); 
    }, function(err){ 
     if(!err){ 
      console.log('We processed each date requests one by one'); 
     } 
    } 
); 

내가 작업하고있는 함수는 loadPage입니다. 보시다시피 매번 날짜 변수에 날짜를 추가 한 다음 수정 된 날짜가있는 URL을 loadPage 함수에 전달합니다. 나는 모든 것을 순조롭게하기 위해 고심하고있다. 내 코드의 나머지 부분은 순서대로 진행되고있는 것처럼 보이지만이 특정 URL을 전달하여 함수가 완료 될 때까지 기다린 다음 두 번째 URL을 전달할 수는 없습니다. 나는 그것이 async.eachSeries 함수의 핵심이라고 생각했다.

그래서 요약하자면, 내가 원하는 :

  1. 전화 첫 번째 URL에서 loadData 기능
  2. 그 기능은 날짜에 추가하고 실행하는 루프하는 (
  3. 계속 완료 될 때까지 기다립니다 loadPage 함수를 다시 실행). 사전에

    function loadPage (url, callback){ 
        data = []; 
        request(url, function(err, response, body){ 
         if(!err && response.statusCode ==200){ 
          console.log('Loading URL: ',url,' into Cheerio.'); 
          var $ = cheerio.load(body); 
          $('td', 'tbody').each(function(){ 
           var text = $(this).text(); 
           data.push(text); 
          }); 
          callback(data); 
         } 
        }); 
    } 
    

    감사 : 여기

는 loadPage 기능 코드입니다!

+0

자바 스크립트 약속을 살펴보십시오. 'async' 라이브러리는 꽤 오래되고 못생긴 솔루션입니다. 약속 개념을 이해하면 약속 대기열을 사용하여 신속하게 질문을 해결할 수 있습니다. – Jehy

답변

0

request이 비동기 함수라고 가정합니다. 따라서이 함수는 별도의 스레드에서 실행 중입니다. 프로그램은 요청이 완료 될 때까지 기다리지 않고 계속 실행되어 설명 된 효과를 생성합니다. 동기 함수를 찾거나 Java에서 세마포어와 같은 것을 구현하여 프로그램이 request이 완료 될 때까지 기다려보십시오.

+0

아마도 내가 오해하고 있습니다 만, node.js의 모든 기능이 비동기 적이 아닙니까? 나는 그것을 작동시키기 위해 일종의 카운터 또는 콜백을 추가해야한다고 생각하고있었습니다. – fullOfQuestions

+0

필자의 테스트에 따르면'$ ('td', 'tbody') 코드의 각 (function() {'섹션은 내가 계속하기 전에 완료해야 할 부분이다.) – fullOfQuestions

+0

@fullOfQuestionions 네. 하지만 콜백은 내가 아는 한 동기식으로 만들지는 않는다. 콜백은'try {return} catch {}'문과 같아서 오류나 결과를 반환하지만, 동기식으로 만들려면 콜백으로 충분하지 않다. – SalmonKiller

관련 문제