2016-03-13 119 views
0

是否有可能在执行一个函数'空闲'几秒钟?在函数内部延迟jquery函数?

我试着用

setTimeout(function(){ 
     $("#nytLevel").hide();       
} , 3000); 

但是函数的其余部分将只执行。

下方的setTimeout我开始一个功能

function timer(){ 
     myVar = setTimeout(function(){ 
      console.log("SLOW"); 
     } , 10000);  
} 

但是当将10秒钟后它就会控制台登录“慢”,但它应该操作台13秒后注销,因为我已经把对的setTimeout 3秒。

+0

你是如何执行你的代码?订单是什么?提供的代码根本不能解释它...... – Rayon

+2

这听起来很像[XY问题](http://xyproblem.info)。为什么不能在第一次超时时间内使用timer()调用? – JJJ

+0

@pushalu setTimeout是一个异步函数 –

回答

3

setTimeout()只是安排将来运行的东西,其余的Javascript继续运行。它不会阻止进一步的Javascript执行。这通常被称为“异步”操作。它在后台运行,并在将来完成其工作时的某个时间调用回调。它也被称为“非阻塞”,因为它不会阻塞你的其他Javascript执行。你想不运行,直到setTimeout()大火,必须把setTimeout()回调内部或从那里叫

什么。

// define function 
function timer(){ 
    myVar = setTimeout(function() { 
      console.log("SLOW"); 
    }, 10000); 
} 

// schedule first timer 
setTimeout(function() { 
    $("#nytLevel").hide(); 

    // now start second timer 
    timer(); 
}, 3000); 

值得一提的是,jQuery有一个.delay()方法与动画等功能放入队列中工作,而且有时可以简化你的代码。在上述情况下,你可以这样做:

$("#nytLevel").delay(3000).hide().delay(10000).queue(function(next) { 
    console.log("SLOW"); 
    next(); // keep the queue moving in case there's something else in the queue 
}); 

请注意:.delay(xxx)只与自己使用队列(如动画),或你把自己使用.queue()队列方法jQuery方法的工作(如我已经在上面显示)。

+0

我的代码包含很多if语句,并且timer和setTimeout不在同一个。所以即使setTimeout是我的计时器有时也不会被调用。但是如果调用setTimeout,定时器应该等待。但我想我会试着用一些变数来做一个严格的方法。 – PushALU

+0

@PushALU - 当您向我们展示您的真实代码(使用if语句)时,我们可以帮助您。当你没有向我们展示实际的代码时,我们无法真正帮助你。 – jfriend00

+0

@PushALU - 增加了关于jQuery'.delay()'和'.queue()'的信息。 – jfriend00

1

setTimeout()是一个异步函数,意味着代码不会暂停,直到setTimeout()时间完成。如果你想与setTimeout()延迟一起代码,就可以把里面的其他代码初始setTimeout()

setTimeout(function(){ 
    $("#nytLevel").hide(); 
    myVar = setTimeout(function(){ 
     console.log("SLOW"); 
    } , 10000);      
} , 3000); 
1

我不建议这一点,但你可以塑造一个递归函数来完成你想要的东西,使用标志在超时之前或之后进行口述。在下面的例子中,你会这样称呼它runAfterTimeout()runAfterTimeout(false)

function runAfterTimeout(run) { 

    if (! run) { 
     console.log('about to wait 10 seconds'); 
     setTimeout(function(){runAfterTimeout(true)},10000); 
     return; 
    } 

    console.log('this section runs after 10 seconds'); 

    setTimeout(function(){$("#nytLevel").hide();},3000); 
} 

小提琴:https://jsfiddle.net/m9n1xxra/

请记住,超时不是100%准确。引擎会寻找适当的执行中断来执行你想要的操作,但是如果引擎处于其他事情的中间,那么它将首先执行。