Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中暂停函数?_Javascript_Settimeout_Cleartimeout - Fatal编程技术网

如何在JavaScript中暂停函数?

如何在JavaScript中暂停函数?,javascript,settimeout,cleartimeout,Javascript,Settimeout,Cleartimeout,我在JavaScript中有一个很长的函数,我将在某些时候暂停它。我知道我可以使用setTimeout(myFunction,100)和clearTimeout()来实现这一点。但是,正如我所知,在使用setTimeout(myFunction,100)100毫秒后,我的函数将从第一行开始执行,此后每隔100毫秒执行一次。我想知道我是否可以在第50行暂停我的函数,然后在第51行之后立即恢复它。这可能吗?您混淆了setTimeout和setInterval 然而,这是完全不可能的 相反,您需要将其

我在JavaScript中有一个很长的函数,我将在某些时候暂停它。我知道我可以使用
setTimeout(myFunction,100)
clearTimeout()
来实现这一点。但是,正如我所知,在使用
setTimeout(myFunction,100)
100毫秒后,我的函数将从第一行开始执行,此后每隔100毫秒执行一次。我想知道我是否可以在第50行暂停我的函数,然后在第51行之后立即恢复它。这可能吗?

您混淆了
setTimeout
setInterval

然而,这是完全不可能的

相反,您需要将其分为两个函数,并使用
setTimeout
从第一个函数调用第二个函数


根据你实际想做什么,承诺可能会有所帮助。

这里有一种方法。确保在外部函数中声明了所有需要始终作为作用域的变量。由于Javascript作用域规则,它们在每个子函数中都是可访问的

function paused() {
  // Define variables you'll need throughout the function.
  var var1, var2, var3;

  // First part of the function
  function part1() {
    // 50 lines
  }

  // Second part of the function
  function part2() {
    // 50 lines
  }

  setTimeout(part1, 0);
  setTimeout(part2, 100);
}
假设有许多部分,超时甚至可以放入一个循环中:

function paused() {
  // Define variables you'll need throughout the function.
  var var1, var2, var3;

  // All function parts.
  var parts = [
    function() {
      // 50 lines
    },
    function() {
      // 50 lines
    },
    function() {
      // 50 lines
    }
    // More?
  ];

  for (var i = 0; i < parts.length; i++) {
    setTimeout(parts[i], i * 100);
  }
}
函数暂停(){
//定义整个函数中需要的变量。
var1,var2,var3;
//所有功能部件。
变量部分=[
函数(){
//50行
},
函数(){
//50行
},
函数(){
//50行
}
//更多?
];
对于(变量i=0;i
请务必小心使用此,因为内部函数将重新绑定它


请注意,由于Javascript事件队列的工作方式,全局函数将始终按顺序执行暂停的部分,而不管每个部分是否需要超过100毫秒。当事件队列发现多个设置超时可以同时执行时,首先排队的设置超时优先。

OP如何混淆
setTimeout
setInterval
?OP想要做的事情并非不可能。您可以使用生成器中途挂起函数。我看不出承诺会有什么帮助。这个答案没有增加任何有价值的东西。它应该是一个注释。OP使用了setinterval标记。这也许是可以纠正的。@Aadit M Shah-如果你再读一遍,你会发现他把
setTimeout
setInterval
@ThanasisGrammatopoulos搞混了不,他不是。如果在函数
foo
中调用
setTimeout(foo,100)
,则递归调用
setTimeout
,这意味着将每隔100毫秒调用
foo
。这绝对不同于
setInterval
。然而,OP应该用一些代码来澄清。看来你是对的…:/请为我们提供一些代码,以便我们能够提供更好的答案。如果您只是在计算,您可能还希望看到网络工作者。我想这就是你想要的。对于es5兼容功能,您可以通过开关盒模拟
屈服
。感谢您帮助我以正确的方式陈述我的问题,并提供链接。我只是在第二个答案下做了评论。如果您在这里发表评论,我们将不胜感激。这里所做的任何事情都会产生额外的怪癖,并进入异步编程领域。例如,将函数分成两部分并调用两次
setTimeout
的代码将返回并继续运行<代码>设置超时仅限计划。它本身不调用或执行任何操作。如果编写其他代码时假设这两部分已经完成,因为函数返回了,那么这将成为一个bug。这并不意味着答案是错误的。它强调需要了解Javascript事件循环如何工作,什么是异步编程,为什么JS
var函数中没有sleep()暂停
,尝试将其译成英语肯定很有趣,但它不是有效的Javascript:)(每个代码块的开头都有一个额外的
var
)如果任何部分的执行时间超过100ms,全局函数将中断。他可以将每个setTimeout插入另一个setTimeout中。@Deuterium:Javascript事件模型将按队列顺序执行超时,超时按自然顺序排队。所以这不是一个问题@凤阳王……哦,太好了!教学坦克!我仍然在C++中思考…道歉。