1

非同期再帰の関数を取得しようとしています。JSでは、これは次のようになります。

(function asyncRecursion(){
  doStuff();

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

これが私がCoffeeScriptで試したことです:

(asyncRecursion = ->
  doStuff()

  setTimeout asyncRecursion, 1000
)()

しかし、これは次のようにコンパイルされます。

(asyncRecursion = function(){
  doStuff();

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

JSHintで「不正な呼び出し」というエラーが発生しました。1行目では、asyncRecursion関数。では、どうすればJSHintの安全な非同期再帰関数を取得できますか。コンパイルされたバージョンは機能しますが、それでもJSHintエラーがあります。または、その「不正な呼び出し」を無視する必要があります。エラー?

4

2 に答える 2

0

JSHintは混乱していると思います。割り当ては式であり、その式の値は割り当ての右側です。つまり、それf = function() { ... }は値が関数である式であるため(f = function() {...})()、完全に有効なJavaScriptです。

これについてJSHintに尋ねると、次のようになります。

var f;
(f = 11)();

同じ「不正な呼び出し」エラーが発生し、JSHintはおそらくのタイプを推測していないことがわかります。これは、(間違いなく関数である場合でも)何もf望んでいません。JSHintに、砂を砕いてより良いツールを見つけるように指示します。ただし、JSHintを使用する必要がある場合は、CoffeeScriptを次の2つの部分で記述できます。(f = x)()xx

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

このJavaScriptを取得します。

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

JSHintはこれに満足しています。オリジナルバージョンと「JSHintを幸せにする」バージョンの両方を実行すると、同じ結果が得られます。

JSHintの型推論の欠如をさらに楽しむために、JSHintがこれについてどう思うかを尋ねてください。

var asyncRecursion;
asyncRecursion = 11;
asyncRecursion();
于 2012-07-29T03:40:56.547 に答える
0

あなたはそれをこのように書くことができます:

asyncRecursion = do ->
  doStuff()

  setTimeout asyncRecursion, 1000

次のようにコンパイルされます。

var asyncRecursion;

asyncRecursion = (function() {
  doStuff();
  return setTimeout(asyncRecursion, 1000);
})();
于 2012-07-30T16:31:11.190 に答える