我想做那样的事情:
var x = function(){
if (controlVar === 0) {
setTimeout(x, 300);
}
else {
return value;
};
js中有一个方法可以调用类似同步代码(var z = x())
的函数,只有当我的controlVar转入1时才返回一个值吗?
这不应该阻止,因为当我使用setTimeout时,主循环应该能够控制,但是如果阻塞对我来说无关紧要。
感谢。
答案 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?。