2012-07-29 7 views
1

비동기식 재귀를위한 함수를 얻으려고합니다.CoffeeScript 및 비동기식 재귀 함수

다음
(function asyncRecursion(){ 
    doStuff(); 

    setTimeout(asyncRecursion, 1000); 
})(); 

내가 커피 스크립트에서 시도한 작업은 다음과 같습니다 : JS 이것은 다음과 같아야합니다

(asyncRecursion = -> 
    doStuff() 

    setTimeout asyncRecursion, 1000 
)() 

그러나 이것은로 컴파일 :

(asyncRecursion = function(){ 
    doStuff(); 

    setTimeout(asyncRecursion, 1000); 
})(); 

그리고 난에 오류가 발생했습니다 JSHint는 '잘못된 호출'을 호출했습니다. 라인 1의 경우 asyncRecursion 함수. 그래서 어떻게 JSHint 안전 비동기 재귀 함수를 얻을 수 있습니다. 컴파일 된 버전이 작동하지만 여전히 JSHint 오류가 있습니다. 아니면 '잘못된 호출'을 무시해야합니다. 오류?

+1

JSHint를 CoffeeScript와 함께 사용할 때의 요점을 이해하지 못합니다. 자바 스크립트를 작성하지 않은 경우 유효성을 검사하는 이유는 무엇입니까? –

+0

그 coffeescript는 자바 스크립트로 컴파일되지 않았습니다. 나는 당신이 당신의 coffeescript의 끝에'()'을 잘못 놓았다고 생각합니다. 또한 클로저를 사용하는 대신'do asyncRecursion = ->'을 사용하는 것이 더 쉽습니다. 오류를 무시할 수 있습니다. –

+0

의견 주셔서 감사합니다. Grunt.js와 함께 CoffeScript를 사용하고 시계 작업은 JSHint를 사용하여 컴파일 된 CoffeeScript의 유효성을 검사합니다. – michsch

답변

0

JSHint가 혼란 스럽다고 생각합니다. 할당은 표현식이며 해당 표현식의 값은 할당의 오른쪽입니다. 이는 f = function() { ... }이 값이 함수 인 표현식이므로 (f = function() {...})()이 완벽하게 유효한 JavaScript임을 의미합니다.

당신이 이것에 대해 JSHint을 요청하는 경우 :

이 이 에게 가

같은 "나쁜 호출"오류가 발생합니다 우리가 JSHint 아마 f의 유형을 추론하지 않는 것을 볼, 그냥 원하지 않는

var f; 
(f = 11)(); 
어떤 x에 대해서도 (f = x)() (심지어 x이 확실히 기능 일 때조차도). 나는 JSHint에게 파운드 샌드를 찾아 가서 더 나은 도구를 찾으라고 말할 것입니다. 이 자바 스크립트를

asyncRecursion = -> 
    doStuff() 
    setTimeout asyncRecursion, 1000 
asyncRecursion() 

를 얻을 : 당신이 JSHint를 사용해야하는 경우에는, 당신은 두 조각에 커피 스크립트를 작성할 수 JSHint이 행복입니다

var asyncRecursion; 
asyncRecursion = function() { 
    doStuff(); 
    return setTimeout(asyncRecursion, 1000); 
}; 
asyncRecursion(); 

합니다. 원래의 "make JSHint happy"버전은 실행될 때 동일한 결과를 생성합니다.

타입 추론의 JSHint의 부족 여분의 재미를 들어

, 그것은이 어떻게 생각하는지 그에게 물어

var asyncRecursion; 
asyncRecursion = 11; 
asyncRecursion(); 
+0

감사! 방금 JSHint가이 경우에는 얼간이라고 생각했지만 확실하지 않았습니다. 그래서 대체 버전을 사용할 것이므로 - 힘을 사용하여 쓸데없는 감시 작업을 호출 할 필요가 없습니다 .-) – michsch

0

당신은 이런 식으로 쓸 수는 :

asyncRecursion = do -> 
    doStuff() 

    setTimeout asyncRecursion, 1000 

그것은 컴파일됩니다

var asyncRecursion; 

asyncRecursion = (function() { 
    doStuff(); 
    return setTimeout(asyncRecursion, 1000); 
})();