2011-06-26 57 views
1

所有這些setTimeout答案在這裏不起作用!在JavaScript中睡眠 - 沒有setTimeout

我只是想等兩個功能之間的幾秒鐘,像這樣:

do_fn1(); 

wait(5000); 

do_fn2(); 
+0

說'setTimeout'不起作用,同時發佈'setTimeout'將是絕對完美的例子似乎有點反作用(因此所有的答案只是告訴你使用它)。也許你應該改善你的問題,以確切顯示你需要做什麼,爲什麼你不能用'setTimeout'來做? –

+0

不@AndyE,他不是在說使用'setTimeout'。 OP想暫停一段時間的執行而不放棄執行回DOM,就像'setTimeout'一樣。 – WebWanderer

回答

8

phpied.com

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > milliseconds){ 
     break; 
    } 
    } 
} 
+3

-1請不要使用此或永遠推薦給任何人。 JavaScript在瀏覽器的UI線程上運行,因此在「睡眠」時,與網頁的任何交互都是不可能的。 –

+0

@非常真實 – leon

+0

這真的很好。我不關心瀏覽器凍結,只是爲了調試目的而需要延遲執行。 – Frodo

0

說,他們都不要沒有工作的例子是大通話,因爲我敢肯定,他們可能會做。

這個怎麼樣,

do_fn1(); 
setTimeout(do_fn2, 5000); 
2

我不認爲你可以。你可能不得不

do_fn1(); 
window.setTimeout(do_fn2, 5000); 
+0

但我不想傳遞第二個函數作爲參數。我有更多的功能跟在它之後,並且我希望每一個延遲.. – Frodo

+0

只需將它們全部包裝在一個新功能中。 –

+0

@Frodo - 在包裝函數中包裝所有「延遲」函數以傳入setTimeout。 –

0

所有這些setTimeout的答案在這裏不起作用!

當然,他們這樣做:

function a() { 
    alert("I'm pretty sure..."); 
} 

function b() { 
    alert("...that they work just fine."); 
} 

a(); 
setTimeout(b, 5000); 
+0

我剛剛意識到,我可以使用警報,而不是睡覺 – Frodo

1

兩個想法:

首先,爲什麼不換了所有的後延遲語句組合成包裝功能

var postDelayFunc = function(){ 
    dosomething(); 
    dosomethingelse(); 
    onemorething(); 
} 

然後在您的代碼中將此函數作爲參數傳遞給setTimeout。

//your code 
dofunc1(); 
setTimeout(postDelayFunc, 1000); 

或者看看jQuery的延期:http://msdn.microsoft.com/en-us/scriptjunkie/gg723713,雖然你可能會寫出來非常相似的代碼。

有一件事讓我感到,雖然你對其他答案的反應,可能出現混亂的地方。我認爲你正在看你的功能,並看到一個單一的線程,你只是想繼續前進一段時間。

你不應該這樣做,儘管在JavaScript中,因爲它綁定了整個瀏覽器,並會惹惱用戶。相反,當你使用setTimeout時,你實際上正在做什麼,表明當超時到期時,另一個線程將接收並執行傳入函數。

一旦設置了超時,正在執行的線程將繼續下一行(這就是爲什麼你認爲超時不起作用)。您可能需要做的是設置超時,並將所有執行後的步驟放入交給定時器的函數中,如上所述。

0

另一個黑客我可能會使用,但是我個人不會推薦它。
退房這裏http://jsfiddle.net/S6Ks8/1/

function parseSleeps(func){ 
    var fdef = func.toString(); 

    var fbody = fdef.match(/\{([\s\S]*)\}/)[1].split(/sleep\(.*?\)\;?/); 
    var sleeps = fdef.match(/sleep\((.*?)\)/g); 
    var fargs = fdef.match(/\(([\s\S]*?)\)/)[1]; 

    var fbodyNew = []; 
    var times = []; 
    fbodyNew.push(fbody.shift(), '\n'); 
    for(var i = 0; sleeps && i < sleeps.length; i++){ 
     var sec = sleeps[i].match(/\d+/)[0]; 
     times.push(sec); 
     fbodyNew.push('setTimeout(function(){\n'); 
     fbodyNew.push(fbody.shift(), '\n'); 
    } 

    while(times.length){ 
     var sec = times.pop(); 
     fbodyNew.push('}, ', sec, ');\n'); 
    } 

    return new Function(fargs, fbodyNew.join('')); 
} 

// Your code from here 

function a(str1, str2){ 
    alert(str1); 
    sleep(3000); 
    alert(str2); 
} 

var func = parseSleeps(a); 
func('here', 'there'); 
0

最明智的方法是有一些像

function a() { 
    // Do stuff 
    setTimeout(b, 42) 
} 

function b() { 
    // Do other stuff delayed 
}  

決不「塊」中的JS任何帖子 - 如果你認爲你需要做的有肯定是一個「更乾淨「的方式來實現您的目標。