运行此代码(在nodejs中)时,'Count'对'count'的大值运行为负。 谁是罪魁祸首,'数'或'链'? 编写'flood'函数的正确方法是什么,以便在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永远不会变为负数。
答案 0 :(得分: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() { ...