2012-07-29 69 views
1

我尝试获取异步递归函数。在JS这应该是这样的:CoffeeScript和异步递归函数

(function asyncRecursion(){ 
    doStuff(); 

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

这里就是我在CoffeeScript中已经试过:

(asyncRecursion = -> 
    doStuff() 

    setTimeout asyncRecursion, 1000 
)() 

但这编译:

(asyncRecursion = function(){ 
    doStuff(); 

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

和我得到一个错误JSHint称为“错误调用”。对于第1行,asyncRecursion函数。 那么我怎样才能得到一个JSHint安全的异步递归函数。编译后的版本可以工作,但仍然存在JSHint错误。或者我应该忽略“错误的调用”。错误?

+1

我不明白在CoffeeScript中使用JSHint的意义。如果你不写JavaScript,为什么要验证它? – 2012-07-29 04:02:49

+0

表示coffeescript没有编译成该javascript。我猜你错了一个'()'在你的咖啡脚本的末尾。此外,仅仅执行'do asyncRecursion = - >'而不是使用闭包更容易。你可以忽略这个错误。 – 2012-07-29 08:18:51

+0

感谢您的意见。我将CoffeScript与Grunt.js结合使用,我的watch任务使用JSHint验证编译后的CoffeeScript。 – michsch 2012-07-29 16:35:28

回答

0

我认为JSHint很困惑。赋值是一个表达式,该表达式的值是赋值的右边;这意味着f = function() { ... }是一个表达式,它的值是一个函数,因此(f = function() {...})()是完全有效的JavaScript。

如果你问JSHint一下:

var f; 
(f = 11)(); 

你会得到同样的“错误调用”错误,我们看到JSHint可能并不推断的f类型,它只是不希望(f = x)()任何x(即使当x绝对是一个函数)。我会告诉JSHint去捣砂并找到一个更好的工具。但是,如果必须使用JSHint,你可以写你的CoffeeScript两个部分:

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

,并得到这个JavaScript:

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

这JSHint很满意。你的原始版本和“make JSHint happy”版本在执行时会产生相同的结果。

对于JSHint缺乏类型推断的额外的乐趣,问它自己认为的这样:

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

谢谢!我只是认为JSHint在这种情况下是个混蛋,但我不确定。所以我会使用你的替代版本,所以不必使用--force ;-)来调用grunt watch任务 – michsch 2012-07-29 16:33:15

0

你可以写这样的:

asyncRecursion = do -> 
    doStuff() 

    setTimeout asyncRecursion, 1000 

它会被编译成:

var asyncRecursion; 

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