2016-03-13 162 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%準確。引擎會尋找適當的執行中斷來執行你想要的操作,但是如果引擎處於其他事情的中間,那麼它將首先執行。