1

在运行此代码(在 nodejs 中)时,“计数”对于较大的“计数”值运行为负数。谁是罪魁祸首,“伯爵”还是“链条”?编写“洪水”函数的正确方法是什么,以便它在 setTimeout() 之后安排下一次调用。

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)

谢谢

更新:如果我调用 chain() 而不是 setTimeout(chain,1),则 Count 永远不会变为负数。

4

1 回答 1

1

chain是全局的,因为您没有使用 var 关键字。这使您的代码表现得像这样,对于runit(3, 4).

4次:

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

然后发生第一轮异步回调。在该轮链中,它引用了正确的函数,因此您将使用正确的链进行另一轮并打印四次“Count 1”,但是在这一轮中,当您调用时,setTimout您将链从最近的调用传递到洪水,所以现在你有 4 个单链异步调用,你会得到:

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

使用声明它var,您的问题将得到解决:

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