我想在javascript中退出当前的调用堆栈,以免爆炸调用堆栈大小,但我无法访问setTimeout()
调用,即:
我的环境中不存在函数setTimeout
:)
当我达到调用堆栈大小限制时,我仍然需要退出当前的调用堆栈。
环境是“parse.com”和CloudCode模块,如果有人知道后面运行的是什么,那么这也有帮助!
有什么猜测吗?
PS:这不是因为你唯一知道的是网页浏览器环境和DOM节点操作,甚至更糟糕的是你需要的Javascript问题,这个问题非常贴切。并非每个功能都在各地实施。 PS2:没有附加源代码,因为它更像是一个理论问题,而不是一个应用的问题!答案 0 :(得分:3)
Javascript支持抛出异常对象(可以是任何真正的东西),它可以根据需要退出调用堆栈。此MDN页面可能有一些用处:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/try...catch
答案 1 :(得分:0)
基于JayC的答案,您可以保留一个要调用的函数队列,并在循环中运行它们。您将在循环中捕获“退出callstack”异常并运行下一个函数。
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”异常)。