2016-05-05 101 views
0

我試圖做的是寫一個函數,例如:如何編寫JavaScript函數,將等待定毫秒

function delay(delay){ 
    var date = new Date(); 
    var startTime = date.getTime(); 


    var currDate=new Date(); 
    var current=currDate.getTime(); 

    while (current<=startTime+delay){ 
     currDate=new Date(); 
     current=currDate.getTime(); 
    } 
} 

此代碼似乎做一些這樣的時候很好地工作

console.log("1"); 
delay(500); 
console.log("2"); 

當做這樣的事情時,它會打印出來給控制檯1,然後等待半秒鐘,然後打印出來2.問題是我不想console.log,我想要document.getElementById("id").innerHTML+="a";。當嘗試圍繞延遲功能時,頁面在加載任何a之前等待所有延遲完成。

我的問題是:

有要麼寫這樣的功能的好方法,或者是有已經是一個功能,即可以允許所有以前的代碼運行,導致在指定的延遲,然後運行它後面的代碼。我一直在使用setTimeout嘗試過,但問題是,運行這樣的:

console.log("1"); 
setTimeout(function(){ 
    console.log("2"); 
}, 2000); 
console.log("3"); 

導致其打印1,然後打印3,然後等待2秒,打印2,而不是做1,等待2秒,打印2,打印3

澄清:我想實現這一點的方法是:

for (i=0;i<10;i++){ 
    document.getElementById("text")+="a"; 
    delay(500);  
} 

這段代碼是應該做的是打印一個字母在同一時間到屏幕上,以半秒在每個字母之間打印

+1

爲什麼你不加'的console.log(3)''裏面時setTimeout'你不希望它在'2'之前打印? –

回答

0

setTimeout是正確的方法。

你想

console.log("1"); 
setTimeout(function(){ 
    console.log("2"); 
    console.log("3"); 
}, 2000); 

將日誌 「1」,等待2秒,然後登錄 「2」,依次爲 「3」。

您的示例不起作用的原因是因爲setTimeout是異步的。這意味着傳遞給setTimeout的函數從setTimeout被調用時開始計劃爲2s,但程序將繼續執行任何以下行。任何你想等待的時間應該在setTimeout之內。

如果您希望延遲後再延遲,可以在回調函數中調用setTimeout

例如:

console.log("1"); 
setTimeout(function(){ 
    console.log("2"); 
    setTimeout(function() { 
     console.log("3"); 
    }, 1000); 
}, 2000); 

其中將記錄 「1」 時,等待2秒,登錄 「2」,等待1秒,然後登錄 「3」。

-

環路與延遲:

而(){ 的console.log( 「1」); (2000); console.log(「2」); 控制檯。日誌( 「3」); }

成爲

var loop = function() { 
    console.log("1"); 
    setTimeout(function() { 
    console.log("2"); 
    console.log("3"); 
    if (<condition>) { 
     loop(); 
    } 
    }); 
}; 

注意,對於大量重複的,你可能會超過可用堆棧。在這種情況下,你可能會採取一些變通辦法像setTimeout(loop, 0);

+0

這個問題是我想在循環中運行代碼,我想要執行一個特定的操作,然後等待,然後for循環應該繼續 – Benya12

+0

我已更新我的問題以包含我想要的代碼做 – Benya12

+0

換句話說,我該如何在語言和環境中設計爲異步的同步事物(異步=不等待事物)?問題是,如果你在緊張的while循環中綁定CPU,就像你在問題中所做的那樣,UI的響應將會受到影響。 –

0

您可以使用回調實現類似的東西:

function execute_after_delay(cb, msg, delay){ 
    setTimeout(function(){ 
     console.log("2"); 
     cb(msg); 
    }, delay); 
} 
console.log("1"); 
execute_after_delay(console.log, 3, 2000);