当前位置: 首页 > 知识库问答 >
问题:

来自setTimeout的Javascript返回值[重复]

巫墨一
2023-03-14

我想这样做:

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

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

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

谢谢

共有1个答案

谢铭
2023-03-14

在js中是否有一种方法可以调用同步代码(var z=x())中的函数,并且仅当我的控制器Var变成1时才返回值?

不,分配是同步的。它不能等待异步函数。更准确地说,x立即返回,它不等待超时。

setTimeout只需将新作业添加到作业队列中。只有在当前作业完成后,才会处理下一个作业。

我想调用一个递归函数,该函数只在类似信号灯的变量变为绿色时返回。

这在JavaScript中不起作用,因为它有“运行到完成”的概念:

在处理任何其他消息之前,每个消息都被完全处理。当对程序进行推理时,这提供了一些很好的属性,包括这样一个事实,即每当函数运行时,它都不能被抢占,并且将在任何其他代码运行之前完全运行(并且可以修改函数操作的数据)。这与C不同,例如,如果一个函数在一个线程中运行,它可以在任何时候停止,在另一个线程中运行其他代码。

回到您的示例,我们首先评估脚本并调用x。这是作业队列的当前状态:

Job Queue--------------------------------------------------+
| +---------------------+                                  |
| |What: evaluate script|                                  |
| |                     |                                  |
| |                     |                                  |
| +---------------------+                                  |
+----------------------------------------------------------+

当执行setTimeout(x,300);一行时,一个新的条目被添加到作业队列中:

Job Queue--------------------------------------------------+
| +---------------------+    +-----------------+           |
| |What: evaluate script|    |What: execute x  |           |
| |                     |    |When: 300ms      |           |
| |                     |    |                 |           |
| +---------------------+    +-----------------+           |
+----------------------------------------------------------+

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

希望这能让我们更清楚地了解为什么x不能等待超时。

有关替代解决方案,请参见如何从异步调用返回响应。

 类似资料:
  • 我正在尝试返回在setTimout中计算的值。但好像我拿不出这个值。我读到要做到这一点,我必须用promise。我是否必须像下面这样使用它:https://italonascimento.github.io/application-a-timeout-to-your-promissions/?

  • 考虑这个代码 我做了一个包装器来延迟的方法调用是否有办法从setTimeout内部的回调中检索值,即从?

  • 我有一个函数,它调用一些服务并返回响应。如果响应为FALSE,它将等待1秒再次询问服务(然后可能返回TRUE)。 如何调用我的函数“checkService()”一次,并获得真正的值?(第一次或第二次尝试,由函数决定)我在函数内设置了RET值,但函数总是返回第一次RET,因为setTimeout是异步的。 换句话说,我需要一些“睡眠”技巧,或者任何解决方案(也可能是jQuery)。

  • 我有一条可以观察到的溪流。第一个运算符是一个mergeMap,它返回一个可观察的数组。然后,我必须有第二个mergeMap从第一个mergeMap的返回中获取最终值。我觉得这第二个合并映射应该是不必要的,但找不到绕过它的方法。 例子: 这最终是我所拥有的。第二个mergeMap只存在于订阅第一个的输出。没有它,我的输出是可观察的(即(1)的

  • 如您所见,它将参数和的和保存在变量中,然后将包含它们的和的eax寄存器保存在变量中,就像函数返回值一样。 这样做是因为函数是用返回值定义的吗?

  • 下面的代码生成一个 空指针异常 由于此人在本例中没有任何,因此我想将返回到 尝试添加仍然会产生相同的错误。 这应该如何处理?如果条件,有没有办法处理同一行代码而不是再检查一行?