Jquery setTimeout不尊重时间

时间:2015-05-03 19:00:28

标签: javascript jquery

我不止一次使用过setTimeout,除了这次我没有发现任何问题。 在这种情况下,setTimeout再次调用我的方法,但不是在3000(或其他)的延迟后,但只是立即,我不能理解为什么..(在函数refreshPhalanx中) 这是代码: (我曾经在3000到3500毫秒之间创建一个随机延迟并将其存储在var" msec"中,但是在我使用3000之后,测试它以防错误是在构造延迟时,但是仍然没有结果..)



var n=1;
function refreshPhalanx(id){
    console.debug(id);
    //$('.refreshPhalanxLink').click();
    if($('#'+id).length){
        console.debug('still going'+n++);
        var msec=Math.floor((Math.random()/2+3)*1000)
        console.debug(msec);
        setTimeout(refreshPhalanx(id), 3000); //I used msec before, but I put 3000 to test if it was just a mistake into the calculation of the milliseconds, or a problem with setTimeout method.
    }
    else
        alert('Alle ore  '+new Date($.now())+' la missione risulta ritirata.');        
}

function delay(){
    if($('.phalanx').length){
        console.debug('appending');
        $('.eventFleet').each(function(){
            $(this).append('<button currentevent="'+$(this).attr('id')+'" class="buttons">calcola rientro</button>');
        })
        console.debug('appending');
        $('.buttons').click(function(){
            console.debug('click --->'+ $(this).attr('currentEvent'));
            refreshPhalanx($(this).attr('currentevent'));
        })
        console.debug('appending');
    }
    else{
        setTimeout(delay, 2000);
        console.debug('delaying');
    }
}

delay();
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

表达式

setTimeout(refreshPhalanx(id), 3000);

表示:调用函数refreshPhalanx(id)并将返回值设置为setTimeout的第一个参数。

setTimeout的概要是function setTimeout(callback, milliseconds),其中回调是可调用的函数或具有函数名称的字符串。

将您的代码更改为

 setTimeout(function () {
       refreshPhalanx(id);
 }, 3000);

答案 1 :(得分:1)

您需要将function作为第一个参数传递给setTimeout。但是对于refreshPhalanx(id),您没有传递函数,而是传递该函数的返回值,在您的情况下为undefined

要传递带参数的函数,只需包装函数:

setTimeout(function(){
  refreshPhalanx(id)
},3000);

最有可能的情况是

setTimeout(delay, 2000);

正常工作,因为在这里你只是传递了函数名而没有用()执行它。

答案 2 :(得分:0)

尝试将您的通话嵌套在setTimeout()内的匿名功能中:

setTimeout(function(){
    refreshPhalanx(id);
}, 3000);

setTimeout(function(){
    delay();
}, 2000);