JavaScript种族条件问题
-
12-09-2019 - |
题
编辑:我发现了我在这里发布的原始YUI3问题的答案,但是它导致了另一个问题,而不是启动一个新线程,而是我认为我只是在这里添加。请向下滚动以获取新问题(它是粗体)。
原始问题:我遇到了一些问题,在YUI定义中创建JavaScript倒计时计时器,我的猜测与对象范围有关。这是我的代码:
YUI({combine: true, timeout: 10000}).use("node", function (Y) {
var timer = new function(){};
Y.augment(timer, Y.EventTarget);
timer.on('timer:down', function() {
Y.log('timer down event fired', 'event');
Y.Lang.later(1000, Y, timer_trigger());
});
timer.on('timer:end', function() {
Y.log('timer end event fired', 'event');
});
var timer_from;
function startTimer(seconds){ // start a coundown from seconds to 0
timer_from = seconds;
timer_trigger();
}
function timer_display(){
var mins = Math.floor(timer_from/60);
var secs = timer_from - mins*60;
var secsDisp = secs;
if(secs<10){
secsDisp = '0' + secs;
}
Y.one('#timer').set('innerHTML', mins + ':' + secsDisp);
}
function timer_trigger(){
Y.log('timer from is: '+timer_from);
if(timer_from > 0){
timer_from--;
timer_display();
if(timer_from > 0){
timer.fire('timer:down');
}
} else {
timer.fire('timer:end');
}
}
function initializePage(){
startTimer(900);
}
});
我遇到的错误是,它不会像我要打电话那样等待1000ms timer_trigger()
野生动物园最终问我是否要停止运行代码。加载页面后几秒钟进行几秒钟时,计时器已经下降到大约3、4分钟。我也尝试使用 setTimeout
但这也会产生相同的结果。谁能帮忙?我真的很感激!
编辑:我实际上已经找到了一个解决方案 - 这是在尝试了数小时的事情之后,但是更多的Google搜索有时仍然可以产生新的结果/答案(我找到了答案 这个网站, , 实际上)。
因此,显然我的代码正在创建种族条件,而我要做的就是解决此问题。
setTimeout(function(){
timer_trigger();
}, 1000);
我查找了比赛条件,但这对我来说尚不清楚这意味着我的含义,以及看似微不足道的代码的变化如何解决了我遇到的问题。因此,最初的问题是回答,但我想将其变成从答案中引起的问题。
JavaScript中的线程如何起作用?什么原因导致我的比赛状况,为什么辅音代码的更改解决了我遇到的错误?
解决方案
另请注意
Y.Lang.later(1000, Y, timer_trigger());
立即执行timer_trigger,并将返回值传递给y.lang.later。你可能的意思是
Y.Lang.later(1000, Y, timer_trigger);
其他提示
问题不是种族条件。 settimeout“修复”您的代码的附加调用是由于逻辑缺陷 timer_trigger
. 。考虑在这种情况下发生的情况 timer_from
当调用函数时为1。计时器:下定时器也不会触发结束者。
function timer_trigger(){
Y.log('timer from is: '+timer_from);
if(timer_from > 0){ // Since timer_from is 1, the if block is entered
timer_from--; // timer_from is 0
timer_display();
if(timer_from > 0){ // This block is not entered, but it has no matching else
timer.fire('timer:down');
}
} else { // The matching if block was entered, so this is not
timer.fire('timer:end');
}
}
您添加了此代码:
setTimeout(function(){
timer_trigger();
}, 1000);
这引起 timer_trigger
再次被称为 timer_from
已经设置为0,允许执行其他块。