2012-11-29 40 views
2

我想退出在JavaScript我当前调用堆栈,为了不爆炸调用堆栈的大小,但我没有访问setTimeout()通话即:退出当前调用堆栈的Javascript

功能我的环境中不存在setTimeout :)

我在达到调用堆栈大小限制时仍然需要退出当前调用堆栈。

环境是“parse.com”和CloudCode模块,如果有人知道后面正在运行什么,那也可能有帮助!

任何猜测? PS:这不是因为你唯一知道的是一个Web浏览器环境和DOM节点操作,或者甚至更糟糕的Javascript,你需要-1这个问题,这是真的有关。并非所有功能都在各地实施。 PS2:没有附加源代码,因为它更像是一个理论问题而不是应用问题!

+0

你试图解决与setTimeout递归?我没有关注。 –

+0

我明白setTimeout调用实际上是创建一个新的调用栈,我需要创建新的调用栈而不需要调用setTimeout。 '.call','.apply'改变执行范围,但递归仍然存在! – flovilmart

+0

如果你的函数是使用[这个技巧](https://gist.github.com/1697037) – Esailija

回答

3

Javascript支持抛出异常对象(可以是任何真正的东西),它可以尽可能多地退出调用堆栈。这MDN页面可能是一些使用:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/try...catch

+0

所以我可以尝试尝试{提高“退出callstack”} catch {fnc()},我仍然会在同一个调用堆栈? – flovilmart

+0

@vfloz是的,只有当你没有发现错误,你才会退出当前的调用堆栈。 – Esailija

+0

但没有捕获错误将导致我的应用程序崩溃...这是为了替换使用setTimeout的异步nextTick行为,我仍然需要捕获错误某处继续执行没有? – flovilmart

0

大厦JayC的答案,你可以保持的功能调用一个队列,并在一个循环中运行它们。您将在循环中捕获您的“退出调用堆栈”异常并运行下一个函数。

nextTick函数会将其参数附加到队列中。

var queue = []; 

function nextTick(f) { 
    queue.push(f); 
} 

while (queue.length > 0) { 
    try { 
     var fun = queue.shift(); 
     fun(); 
    } 
    catch (ex) { 
     if (ex !== 'exit callstack') { 
      // Handle "real" exceptions here 
     } 
    } 
} 

我还没有测试代码,但这个想法应该工作。当然,有一点需要注意的是,你不能在异步函数中使用异常处理(除非你检查并重新抛出“exit callstack”异常)。

+0

什么是try catch实际添加在这里,我的意思是它会在没有提供任何异常的情况下工作相同 – Esailija

+0

@Esailija你说得对,如果让每个函数都运行,你就不一定需要它到最后。抛出一个异常只是让你能够在代码中的任何一点打破当前的迭代。如果您想要在抛出异常时总是调用下一个排队函数,那么捕获异常也是必要的。 –