编辑:我发现了我在这里发布的原始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,允许执行其他块。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top