Javascript 退出在循环中调用的回调函数
为了好玩,我编写了这个小助手函数,使循环更具可读性。它基本上包装了一个while循环,并将回调作为参数。现在,我想知道如何从回调函数中打破while循环。简单地从回调中返回将不起作用,我也不能从回调中调用breakJavascript 退出在循环中调用的回调函数,javascript,loops,while-loop,callback,break,Javascript,Loops,While Loop,Callback,Break,为了好玩,我编写了这个小助手函数,使循环更具可读性。它基本上包装了一个while循环,并将回调作为参数。现在,我想知道如何从回调函数中打破while循环。简单地从回调中返回将不起作用,我也不能从回调中调用break const loopFor=(时间)=>{ 返回{ 毫秒:(回调)=>{ const start=Date.now() while(Date.now()-开始{ log(“Weeeeeee,我在循环”) }) log(“完成循环”)我认为这不是一种可取的方法,但如果必须继续使用这种
const loopFor=(时间)=>{
返回{
毫秒:(回调)=>{
const start=Date.now()
while(Date.now()-开始<时间){
回调函数()
}
}
}
}
循环时间(100).毫秒(()=>{
log(“Weeeeeee,我在循环”)
})
log(“完成循环”)
我认为这不是一种可取的方法,但如果必须继续使用这种方法,则必须围绕提供一些返回值来中断while循环来设计回调
例如
const loopFor=(时间)=>{
返回{
毫秒:(回调)=>{
const start=Date.now()
while(Date.now()-开始<时间){
如果(!callback()){//Break如果回调返回false
打破
}
}
}
}
}
循环时间(100).毫秒(()=>{
log(“Weeeeeee,我在循环”)
设条件=1>5//一些基本条件
返回条件
})
log(“完成循环”)
我认为这不是一种可取的方法,但如果必须继续使用这种方法,则必须围绕提供一些返回值来中断while循环来设计回调
例如
const loopFor=(时间)=>{
返回{
毫秒:(回调)=>{
const start=Date.now()
while(Date.now()-开始<时间){
如果(!callback()){//Break如果回调返回false
打破
}
}
}
}
}
循环时间(100).毫秒(()=>{
log(“Weeeeeee,我在循环”)
设条件=1>5//一些基本条件
返回条件
})
log(“完成循环”)
您可以从回调返回
const loopFor=(时间)=>{
返回{
毫秒:(回调)=>{
const start=Date.now()
while(Date.now()-start
您可以从回调返回
const loopFor=(时间)=>{
返回{
毫秒:(回调)=>{
const start=Date.now()
while(Date.now()-start
你不能-JS中的userland是单线程的。像这样的循环是一个非常糟糕的主意,请研究使用setInterval
或setTimeout
除非你想在回调中有某种返回值,并检查你是否调用break
,否则你不能这样做。不过,正如@Keith所说,这个循环从一开始就是个坏主意。如果您在浏览器中运行此操作,它将在循环期间阻止页面上的所有JavaScript执行。若要扩展@Keith的注释,这是不好的,因为它将阻止事件循环,而其他内容将无法运行。这对Node并没有那么糟糕,但在前端代码中应该绝对避免这种情况。谢谢各位,我知道它会阻塞线程。我主要在Node中使用它,用于运行montecarlo树搜索和类似的东西,在这里,您希望在给定的时间内运行算法。在浏览器中,我使用WebWorkers使它在不同的线程中运行。你不能-JS中的userland是单线程的。像这样的循环是一个非常糟糕的主意,研究使用setInterval
或setTimeout
除非您希望在回调中有某种返回值,并检查是否调用break
,否则无法执行此操作。不过,正如@Keith所说,这个循环从一开始就是个坏主意。如果您在浏览器中运行此操作,它将在循环期间阻止页面上的所有JavaScript执行。若要扩展@Keith的注释,这是不好的,因为它将阻止事件循环,而其他内容将无法运行。这对Node并没有那么糟糕,但在前端代码中应该绝对避免这种情况。谢谢各位,我知道它会阻塞线程。我主要在Node中使用它,用于运行montecarlo树搜索和类似的东西,在这里,您希望在给定的时间内运行算法。在浏览器中,我使用WebWorkers使其在不同的线程中运行。