2016-03-22 25 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