2012-07-29 87 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); 
})();