2016-07-15 64 views
-1

我有一個叫做「loop」的函數,它被重複使用setInterval()調用。在該函數內部,我需要另一個函數,它必須被稱爲「delay()」(它必須是確切的語法)。在不凍結瀏覽器的情況下睡在setInterval裏面

所以我結束了這一點:

function loop() { 
    console.log("some code") 
    delay(100) 
    console.log("some more code") 
    delay(100) 
} 



if (typeof loop != "undefined") 
    window.loopInterval = setInterval(loop, 1) 

function delay(millis) { 
    var now = Date.now(); 
    while(Date.now() < now + millis){} 
} 

這工作得很好,但它凍結使其不能正常顯示某些變化瀏覽器。
現在有什麼辦法可以改變延遲功能,以便它暫時暫停setInterval?

正如我所說的,循環和延遲函數的語法必須保持不變。是的,我有很好的理由。

所有這些誰不相信我,我其實是有一個很好的理由,在這裏你去:爲Arduinos書面https://github.com/T-vK/LedStripSimulator
代碼幾乎總是使用循環()函數和延遲()也對Arduinos來說是非常普遍的事情,因爲他們往往只做一件事。而JS模擬器的目的是儘可能準確地複製Arduino語法,當然需要一個同步延遲功能。

+3

簡單的回答:不。告訴我們你打算如何完成某件事情,告訴我們你正試圖解決的問題。 (而當你試圖解決的問題不是「如何才能完成這項工作」,當它根本無法設計瀏覽器的本質時) –

+1

沒有。不能用你的「精確語法」來實現 – rgthree

+1

這不是導致延遲的正確方法。這顯然會暫停腳本執行,直到while循環退出。你可以使用'setTimeout'來解決問題。 –

回答

-2

編輯:Here is a complete project I've been working on that easily demonstrates that it works.

我想通了......我只是在一個單獨的線程中運行我的代碼。在那個線程中,我可以整天睡覺,DOM渲染不會受到影響。

(瀏覽器必須支持webworkers)

//Code that runs in a separate thread: 
 
var blob = new Blob([` 
 
    function loop() { 
 
     console.log("some code"); 
 
     delay(1000); 
 
     console.log("some more code"); 
 
     delay(1000); 
 
    } 
 
    function delay(millis) { 
 
     var now = Date.now(); 
 
     while(Date.now() < now + millis){} ; 
 
    } 
 
    if (typeof loop != "undefined") 
 
     setInterval(loop, 1); 
 
`], { type: "text/javascript" }); 
 

 
var worker = new Worker(window.URL.createObjectURL(blob)); 
 

 
//Code that runs in the UI thread: 
 
var text = 'This text will be added to this div letter by letter without any freezing from the delay() function.'; 
 
var currentLetter = 0; 
 
var maxLetter = text.length-1; 
 
var div = document.getElementById('lagFree'); 
 

 
setInterval(function() { 
 
    div.innerHTML = div.innerHTML + text[currentLetter]; 
 
    if (currentLetter >= maxLetter) { 
 
     div.innerHTML = ''; 
 
     currentLetter = 0; 
 
    } else 
 
     currentLetter++; 
 
},10);
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8" /> 
 
</head> 
 
<body> 
 
    <div id="lagFree"></div> 
 
</body> 
 
</html>

正如你可以在控制檯中看到,它「更多的代碼」一遍又一遍打印「一些代碼」和一個1000毫秒同步延遲之間。即使我們這樣做了,用戶界面也不會凍結,文本動畫也能順利運行。

相關問題