2016-03-22 23 views
1

我想要做這樣的事情的Javascript返回值:從setTimeout的

var x = function(){ 
    if (controlVar === 0) { 
    setTimeout(x, 300); 
    } 
    else { 
    return value; 
}; 

是否有JS呼叫的功能的方法類似在同步代碼(var z = x())並返回一個值,只有當我controlVar依次1?

這不應該阻塞,因爲當我使用setTimeout時主循環可以控制,但是如果阻塞對我無關緊要。

謝謝。

+0

請說明您的具體問題或添加更多的細節,以確切地突出你需要什麼。正如目前所寫,很難確切地說出你在問什麼。 –

+0

對不起,這不能阻止,因爲如果阻止我的controlVar不能打開1. – Fi3

+0

請嘗試描述你想要達到的目標,而不僅僅是問題。 –

回答

1

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?

+0

感謝這很清楚 – Fi3