2012-02-03 6 views
1

나는 2 초마다 1 회의 요청 만 허용하고 요청을 만들기 위해 재귀를 사용하고자하는 reddit 용 웹 크롤러를 작성하고 있습니다. 1 명이 의견을 요청하는 일련의 요청이 완료된 후 완료를 표시하고 메시지 대기열의 다음 사용자 이름에 대한 의견을 다시 보내고 싶습니다. 문제는 내가 한 레벨 이상 깊이있을 때마다 "TypeError : Object #가 메소드를 방출하지 않습니다"라는 것입니다.함수가 재귀 적으로 호출 할 때 "메서드 없음"오류가 발생합니다.

나는 이것을하기위한 더 좋은 방법을 열어두고 있으며, 나는 이제 막 노드를 배우기 시작했으며 이것을 달성하는 훨씬 더 좋은 방법이 있음을 확신한다.

아래의 요지에 내 코드를 게시했습니다 ... 어떤 도움도 좋을 것입니다!

https://gist.github.com/1729182

+0

최소 실패 사례를 작성하고 여기에 게시하는 것이 좋습니다. 어쨌든, 그 오류는 간단합니다 :'self.emit'을하고 있습니다.'self'는 'emit' 속성을 가진 객체로 평가되지 않습니다 (함수로 평가되는 것보다 훨씬 적습니다). 그래서 * 정확하게 * '자기'이고, 왜 변화를 평가할 것인가? (이것들은 개발자/디버거를위한 질문입니다; –

+0

@pst 왜 재귀 호출이 없을 때 작동합니까? 나는 여전히 자바 스크립트 범위 지정에 대한 내 머리를 감싸려고 노력하고있다 ... 내 문제가 거기에 있다고 생각한다. – Hortinstein

+0

코드를 여기에 게시하고 코드 조각을 오류를 생성하는 최소 코드로 줄이는 것을 고려한다. – millimoose

답변

2

문제는 함수 호출에 대해 "수신기"로 평가되는 키워드 (여유 변수)입니다 this 함께. 예를 들어 주어진

:

x = {fn: function() {return this} } 
x.fn() 

그럼 fn 내부 thisx (그리고 따라서 x.fn() === x)에 어떤 평가 평가

. 코드 grabComments없이 수신기로 호출되며,이 경우 this은 글로벌 개체로 되돌아갑니다. Function.call/apply에 관심이 있거나 중첩 된 함수를 사용하여 함수를 사용하여 재귀를 처리하는 코드를 단순화하여 self이 범위에 묶여있을 수 있습니다.

항목 :

(그들은 단지 특성에 밀려 함수이고, 그래서 수신기는 executiong 기능에 this을 결정하는데 중요하다 JavaScript에서, 방법 객체에 바인딩이다.)

해피.

+0

굉장! 나는 여전히 내 솔루션이 최선의 방법이라고 확신하지 못하고 결국 자바 스크립트를 더 잘 이해하면 결국 리팩토링하고 돌아 오겠지만 적용은 나를 위해 일했다. 그 링크도 우수합니다! 내가 사용한 : 'grabComments.apply (self, args); '. – Hortinstein

+0

grabComments 함수 내에서 재귀를 중첩시킬 수있는 방법을 알고 싶습니다. 그리고 최종 호출 후에 만 ​​'다음'으로 계산됩니다. 노드가 비 블로킹 (non blocking)이기 때문에 ... 컨트롤 플로우 기사를 읽어야합니다. 당신의 도움을 주셔서 감사합니다! – Hortinstein

관련 문제