Javascript从setTimeout返回值

时间:2016-03-22 17:29:32

标签: javascript asynchronous settimeout

我想做那样的事情:

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

js中有一个方法可以调用类似同步代码(var z = x())的函数,只有当我的controlVar转入1时才返回一个值吗?

这不应该阻止,因为当我使用setTimeout时,主循环应该能够控制,但是如果阻塞对我来说无关紧要。

感谢。

1 个答案:

答案 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?