【问题标题】:Javascript return value from setTimeout [duplicate]来自setTimeout的Javascript返回值[重复]
【发布时间】:2016-03-22 17:29:31
【问题描述】:

我想做这样的事情:

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

js中是否有一种方法可以像同步代码(var z = x())一样调用函数并仅在我的controlVar转为1时才返回值?

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

谢谢。

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。
  • 对不起,这不能阻塞,因为如果阻塞我的 controlVar 不能转入 1。
  • 请尝试描述您想要实现的目标,而不仅仅是问题。
  • 为了澄清,我想调用一个递归函数,该函数仅在像信号量一样的变量变为绿色时才返回。我想这样调用这个函数 'var x = f(z)'
  • 没有。如果你不想阻塞(也不想阻塞),你不能return异步回调的值。

标签: javascript asynchronous settimeout


【解决方案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      |           |
| |                     |    |                 |           |
| +---------------------+    +-----------------+           |
+----------------------------------------------------------+

为了处理下一个条目,当前作业必须首先完成。这意味着,由于我们当前正在调用xx 必须终止。只有在x 返回后,事件循环才能继续下一个作业并再次调用x

希望这可以更清楚地说明为什么x 不能等待超时。


有关替代解决方案,请参阅How do I return the response from an asynchronous call?

【讨论】:

  • 谢谢这个很清楚
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 2018-04-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多