如何在JavaScript中编写递归阻塞函数而不会溢出堆栈
How do I write a recursive blocking function in JavaScript without overflowing the stack?
感谢您的关注。
<标题> 的背景我正在为客户端编写一个javascript繁重的应用程序,并且需要一个实用程序函数,我可以通过一个条件和一个回调函数。如果不满足条件,我需要等待几毫秒,然后再次测试。如果满足条件,则执行回调。
目前我有什么
我已经将这个方法作为实用程序类的一部分编写:
ThreadLocker: function (condition, callback) {
//If condition is true then it resumes running code
if (condition()) {
callback();
} else { //Else it waits 10ms and tries again
setTimeout(Util.ThreadLocker(condition,callback), 10);
}
}
下面是它的用法:
var condition = function(){return (myGlobalVariable == "foo") ? true : false;};
var callback = function(){alert("Ready to rock!");};
Util.Threadlocker(condition,callback);
<标题>即使我将超时时间设置为10 秒,我也会立即获得堆栈溢出。这是Chrome给我的:
"超过最大调用堆栈大小。"
如果你看一下堆栈,看起来这个函数在一毫秒或两毫秒内被调用了几十次,即使setTimeOut被设置为10秒。
我在这里做错了什么?
标题>标题>setTimeout(Util.ThreadLocker(condition,callback), 10);
直接调用你的'ThreadLocker'函数,没有超时设置。试着
setTimeout(function () { Util.ThreadLocker(condition,callback); }, 10);
你可能还需要知道,javaScript不是多线程的。它只是在n毫秒后调度函数,或者在没有其他任务执行时立即调度函数。对于间隔也是一样,如果您创建一个10ms的间隔:任务需要30ms,它将在第10ms执行,然后在第40 ms开始执行(在第一个任务完成后立即执行)。
所以你不能真正锁,但也没有其他东西可以竞争你的代码。
至于堆栈溢出:如果你真的有这种情况,例如:一个递归函数可能会溢出500万行的堆栈(在IE中,在页面加载期间执行的Javascript行数),您可以使用超时0来延迟函数:
setTimeout(function () { }, 0);
相关文章:
- d3中堆栈函数和嵌套函数之间的差异
- 为什么我的JavaScript堆栈排序函数不起作用
- 如何远程检查JavaScript应用程序的函数调用堆栈
- js函数堆栈传入变量,.hide()不起作用
- 轮询 ajax 函数超出调用堆栈
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 当一个变量被传递给一个函数时,JavaScript堆栈会发生什么
- 日志记录功能/对象名称's在函数堆栈内的javascript中
- 平均堆栈:如何将函数的结果更新到数据库
- 为什么我的jQuery函数在IE 8中导致“堆栈溢出”错误
- Javascript 获取调用堆栈上的函数数量
- 在 Javascript 中,递归函数一旦达到基本情况并开始向下移动堆栈,就会释放它的资源
- 在 javascript 中使用函数堆栈调用非递归方法
- 没有递归函数,仍然获取超出最大调用堆栈大小的错误
- javascript递归函数:Uncaught RangeError:超过了最大调用堆栈大小
- 何时在窗口上提供正确的堆栈跟踪.错误函数
- 在不超过堆栈限制的情况下,迭代或递归大量庞大函数的最佳方式是什么
- promisifyAll函数中的回调没有堆栈跟踪
- 有人知道如何在javascript中以编程方式获得函数调用堆栈(回溯)吗?
- 阶乘函数运行错误:超过了最大调用堆栈大小