1

このコードを (nodejs で) 実行すると、「カウント」の値が大きいと「カウント」が負になります。犯人は「伯爵」か「鎖」か。setTimeout() の後に次の呼び出しをスケジュールするように、「flood」関数を記述する正しい方法は何ですか。

flood =  function( count) {    
    chain = function() {
        --count;
        console.log("Count " + count)
        if( count > 0 ) {
            setTimeout(chain, 1);
        }
    };
    chain();
}


runit = function (count,par) {
    console.log("RUNIT: " + count + " , " + par )
    for( var i = 0 ; i < par ; i ++ ) {
        flood(count)
    }
}

runit(3,4)

ありがとう

更新: setTimeout(chain,1) の代わりに chain() を呼び出すと、カウントが負になることはありません。

4

1 に答える 1

1

chainvar キーワードを使用していないため、グローバルです。これにより、コードはそのように動作しますrunit(3, 4)

4回:

flood(2); // Prints "Count 2" and calls setTimeout

次に、非同期コールバックの最初のラウンドが発生します。そのラウンドでは、正しい関数を参照している間にチェーンが渡されたため、正しいチェーンを使用して別のラウンドがあり、「Count 1」を 4 回出力しますが、このラウンドでは、呼び出し時にsetTimout最新の呼び出しからチェーンを渡しますフラッドなので、単一のチェーンに 4 つの非同期呼び出しがあり、次のようになります。

"Count 0"
"Count -1"
"Count -2"
"Count -3"

を使用して宣言するvarと、問題が解決されます。

var chain = function() { ...
于 2013-07-17T17:20:16.287 に答える