2013-02-23 81 views
0

我知道,我知道這不是一個好設計。非阻塞setTimeout或setInterval是更好的方法,但爲了實現非阻塞,您需要重構整個代碼以在我的方案中具有回調點。讓我來解釋:需要在javascript中阻止睡眠

  1. 我有一個功能,目的是從緩存中獲取的對象(存儲)
  2. 如果對象是可用的,我把它
  3. 當對象是不可用的,我請求爲它,並等待,直到通過輪詢可用,到期計數器/時間。在一個點上(不太遠),這將是可用的,然後我返回給調用者

無法實現回調,因爲調用(棧)的鏈條非常深和複雜的,這是根本不可能重構所有代碼以使用異步回調/等。在這個特定的情況下,我真的需要一個單線程的阻塞循環。

現在,這裏是一個問題:

我不只是想用一個簡單的for循環與抗衡。這會消耗太多的CPU週期,並會導致電腦風扇啓動(即使幾秒鐘)。我期待找出什麼是JavaScript命令,最慢的(或一組命令),我可以作爲封閉的方式使用,如:

while (needToContinue) { 
    slowestCommandOrFunction(); 
    needToContinue = checkIfNeedToContinue(); 
} 
+0

在網頁瀏覽器的JavaScript中,根本就沒有這種東西。在Node.js中,您可能可以做一些事情,比如使用特殊的「慢速」設備和同步I/O操作來有效地暫停執行。 (*編輯* Explosion Pills明智地注意到同步XHR的存在) – Pointy 2013-02-23 14:39:57

+3

您知道,瀏覽器在您運行此「阻塞睡眠」的整個過程中都沒有響應? – Sirko 2013-02-23 14:41:52

+0

你想要的不是你所需要的 - JavaScript不能這樣工作。它在單個線程上運行,與頁面的其餘部分共享,因此如果阻止,頁面上的所有JAVASCRIPT都會被阻止。用戶界面代碼無法運行,甚至無法更新進度條。如果你的呼叫鏈很深,你必須處理「資源現在不可用」這個事實是一個返回狀態。 – 2013-02-23 16:47:48

回答

2

聽起來好像它是要同步Ajax請求。你可以用第三個參數做這XMLHttpRequest.open

xhr.open('GET', url, false); 

我還是建議您採取重構你的代碼的時候,雖然。

+0

不完全是我正在處理的。我的代碼非常龐大而且非常複雜(20000行js),它不會以100%的異步方式執行。不幸的是,這是JavaScript的限制。一個單純的CPU同步睡眠功能可以創造奇蹟,如果可能的話,但迄今爲止的循環都會導致CPU的強化。 – gextra 2013-02-23 16:19:10

1

如果你想加快重構,你可以使用streamlinejs。基本上,你必須用streamlinejs編譯你的JS,但作爲交換,你可以通過在所有參數列表中加下劃線來使同步函數成爲異步函數。例如。

function foo() { 
    for (var i=0; i<10; i++) { 
    bar() 
    } 
} 

簡直變成

function foo(_) { 
    for (var i=0; i<10; i++) { 
    bar(_) 
    } 
} 

此外,如果您正在使用服務器端JavaScript和的NodeJS,你可以使用纖維。

+0

很好的建議。謝謝。對不起,我現在還不能投票(到目前爲止聲譽很低) – gextra 2013-02-23 16:15:34