如何在JavaScript中暂停一个函数?

4
我有一个长的JavaScript函数,我想在某些点上暂停它。我知道可以使用setTimeout(myFunction, 100)clearTimeout()来实现这一点。但是,我知道在使用setTimeout(myFunction, 100)后,我的函数将在100毫秒后从第一行开始执行,之后每100毫秒执行一次。我想知道是否可以在函数的第50行暂停函数,然后在该行之后立即恢复执行,也就是在第51行继续执行。这是否可能?

1
请提供一些代码,以便我们能够提供更好的答案。 - Aadit M Shah
如果你只是进行计算,你可能还想看看Web Workers。http://www.html5rocks.com/en/tutorials/workers/basics/ - GramThanos
3
我认为 function* 是你想要的。对于兼容 ES5 的函数,你可以通过 switch case 模拟 yield - Herrington Darkholme
感谢您帮助我以正确的方式陈述我的问题,并提供链接。我刚在第二个答案下发表了评论,期待您的回复。 - Suo6613
在这里任何不会创建额外怪异行为并进入异步编程领域的事情都做不到。例如,将函数分成两个部分并调用setTimeout两次的代码将返回并继续运行。 setTimeout只是计划执行,并不会直接调用或执行任何内容。如果编写其他代码假设这两个部分已经完成,因为函数已经返回,那么就会出现错误。这并不意味着答案错误,而是强调需要学习JavaScript事件循环的工作原理,异步编程是什么,以及JS中为什么没有sleep() - Paul
非常感谢 @Paul 的评论。 - Suo6613
2个回答

2

以下是一种方法。确保你需要的所有变量在外部函数中声明。由于 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);
  }
}

请注意使用this时要谨慎,因为内部函数会重新绑定它。

请注意,全局函数将始终按顺序执行已暂停的部分,无论每个单独的部分是否需要超过100毫秒,这是由于Javascript事件队列的工作方式决定的。当事件队列看到多个setTimeout同时可执行时,排在第一位的优先执行。


3
“var function paused”作为英语确实很有趣尝试去解释,但它不是有效的JavaScript代码。 :)(你在每个代码块的开头多加了一个“var”) - tckmn
2
如果任何部分执行时间超过100毫秒,全局函数将会中断。 - rnrneverdies
他可以将每个setTimeout嵌套在另一个中。 - GramThanos
@Deuterium:Javascript事件模型将按队列顺序执行超时,而超时将按自然顺序排队。因此这不是一个问题。"如果在同一调用帧中对setTimeout进行两次调用-传递相同的第二个参数值-它们的回调将按调用顺序排队。" - Fengyang Wang
@FengyangWang ...哦,太棒了!谢谢你的教导!我还在想C++...抱歉。 - rnrneverdies
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Paul

0
你混淆了setTimeout和setInterval。
然而,这是完全不可能的。
相反,你需要将它分成两个函数,并使用setTimeout从第一个函数调用第二个函数。
根据你实际尝试做什么,promises可能会有所帮助。

OP是如何混淆setTimeoutsetInterval的?OP想要做的并不是不可能的。您可以使用生成器来暂停函数的执行。我不明白Promise怎么可能有帮助。这个答案没有提供任何有价值的信息,应该作为评论发表。 - Aadit M Shah
OP使用了setinterval标签。这可能需要进行更正。 - Fengyang Wang
非常感谢。我觉得,是的,我对这些事情感到困惑,如果你们能帮我就太感激了。实际上,我正在使用PhantomJS爬取一个网站。我有一堆函数。我想在触发每个请求后立即停止所有函数,并在收到所有响应后恢复我的函数(在我停止函数的那一行之后)。因此,我不知道哪个函数会触发下一个请求。我不希望我的函数每100毫秒执行一次。我的意思是,我这里不想有任何延迟。 - Suo6613
但是,根据您的定义,似乎我在这里使用了延迟。我的代码行数太多了,我不知道哪一部分可以帮助我更好地解释我的问题。我的问题清楚吗?还是需要我用不同的方式来解释? - Suo6613
感谢@SLaks的评论。 - Suo6613
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接