我知道,我知道這不是一個好設計。非阻塞setTimeout或setInterval是更好的方法,但爲了實現非阻塞,您需要重構整個代碼以在我的方案中具有回調點。讓我來解釋:需要在javascript中阻止睡眠
- 我有一個功能,目的是從緩存中獲取的對象(存儲)
- 如果對象是可用的,我把它
- 當對象是不可用的,我請求爲它,並等待,直到通過輪詢可用,到期計數器/時間。在一個點上(不太遠),這將是可用的,然後我返回給調用者
我無法實現回調,因爲調用(棧)的鏈條非常深和複雜的,這是根本不可能重構所有代碼以使用異步回調/等。在這個特定的情況下,我真的需要一個單線程的阻塞循環。
現在,這裏是一個問題:
我不只是想用一個簡單的for循環與抗衡。這會消耗太多的CPU週期,並會導致電腦風扇啓動(即使幾秒鐘)。我期待找出什麼是JavaScript命令,最慢的(或一組命令),我可以作爲封閉的方式使用,如:
while (needToContinue) {
slowestCommandOrFunction();
needToContinue = checkIfNeedToContinue();
}
在網頁瀏覽器的JavaScript中,根本就沒有這種東西。在Node.js中,您可能可以做一些事情,比如使用特殊的「慢速」設備和同步I/O操作來有效地暫停執行。 (*編輯* Explosion Pills明智地注意到同步XHR的存在) – Pointy 2013-02-23 14:39:57
您知道,瀏覽器在您運行此「阻塞睡眠」的整個過程中都沒有響應? – Sirko 2013-02-23 14:41:52
你想要的不是你所需要的 - JavaScript不能這樣工作。它在單個線程上運行,與頁面的其餘部分共享,因此如果阻止,頁面上的所有JAVASCRIPT都會被阻止。用戶界面代碼無法運行,甚至無法更新進度條。如果你的呼叫鏈很深,你必須處理「資源現在不可用」這個事實是一個返回狀態。 – 2013-02-23 16:47:48