如何在JavaScript中暂停函数?
我在JavaScript中有一个很长的函数,我将在某些时候暂停它。我知道我可以使用如何在JavaScript中暂停函数?,javascript,settimeout,cleartimeout,Javascript,Settimeout,Cleartimeout,我在JavaScript中有一个很长的函数,我将在某些时候暂停它。我知道我可以使用setTimeout(myFunction,100)和clearTimeout()来实现这一点。但是,正如我所知,在使用setTimeout(myFunction,100)100毫秒后,我的函数将从第一行开始执行,此后每隔100毫秒执行一次。我想知道我是否可以在第50行暂停我的函数,然后在第51行之后立即恢复它。这可能吗?您混淆了setTimeout和setInterval 然而,这是完全不可能的 相反,您需要将其
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事件循环如何工作,什么是异步编程,为什么JSvar函数中没有sleep()暂停
,尝试将其译成英语肯定很有趣,但它不是有效的Javascript:)(每个代码块的开头都有一个额外的var
)如果任何部分的执行时间超过100ms,全局函数将中断。他可以将每个setTimeout插入另一个setTimeout中。@Deuterium:Javascript事件模型将按队列顺序执行超时,超时按自然顺序排队。所以这不是一个问题@凤阳王……哦,太好了!教学坦克!我仍然在C++中思考…道歉。