js中是否有方法調用同步代碼中的函數(var z = x()
),並且僅當我的controlVar變爲1時才返回值?
編號分配是同步的。它不能等待異步功能。更確切地說,x
立即返回,它不會等待超時。
setTimeout
只是將新作業添加到作業隊列中。只有當當前作業完成後,下一個作業纔會被處理。
我想調用一個遞歸函數,只有當像信號燈那樣動作的變量變爲綠色時纔會返回。
這並不在JavaScript中工作,因爲它有"run to completion"概念:
處理任何其他消息之前,每個消息被完全處理。在推理你的程序時,這提供了一些很好的屬性,包括每當一個函數運行時,它不能被搶佔,並且會在任何其他代碼運行之前完全運行(並且可以修改該函數操縱的數據)。這與C不同,例如,如果某個函數在一個線程中運行,則可以在任何時候停止它以在另一個線程中運行其他代碼。
回到您的示例,我們從評估腳本開始,並致電x
。這是當前狀態的作業隊列:
Job Queue--------------------------------------------------+
| +---------------------+ |
| |What: evaluate script| |
| | | |
| | | |
| +---------------------+ |
+----------------------------------------------------------+
在執行線setTimeout(x, 300);
,一個新的條目添加到作業隊列:
Job Queue--------------------------------------------------+
| +---------------------+ +-----------------+ |
| |What: evaluate script| |What: execute x | |
| | | |When: 300ms | |
| | | | | |
| +---------------------+ +-----------------+ |
+----------------------------------------------------------+
爲了使下一個條目被處理,目前的工作必須先完成。這意味着,由於我們目前正在呼叫x
,所以x
必須終止。只有在返回x
後,事件循環才能轉到下一個作業並再次呼叫x
。
希望這使得它更清晰一點,爲什麼x
不能等待超時。
如需替代解決方案,請參閱How do I return the response from an asynchronous call?。
請說明您的具體問題或添加更多的細節,以確切地突出你需要什麼。正如目前所寫,很難確切地說出你在問什麼。 –
對不起,這不能阻止,因爲如果阻止我的controlVar不能打開1. – Fi3
請嘗試描述你想要達到的目標,而不僅僅是問題。 –