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
请尝试描述你想要达到的目标,而不仅仅是问题。 –