2

感谢您的关注。

背景

我正在为客户端编写一个重 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 seconds,我也会立即发生堆栈溢出。这是 Chrome 给我的:

“超出最大调用堆栈大小。”

如果您查看堆栈,即使 setTimeOut 设置为 10 秒,该函数也似乎在一两毫秒内被调用了几十次。

我在这里做错了什么?

4

1 回答 1

3

线

setTimeout(Util.ThreadLocker(condition,callback), 10);

直接调用你的'ThreadLocker'函数,没有设置超时。尝试

setTimeout(function () { Util.ThreadLocker(condition,callback); }, 10);

您可能还需要知道,javascript 不是多线程的。它只是在 n 毫秒后调度您的函数,或者在没有执行任何其他操作时立即调度您的函数。间隔也一样,如果你创建一个 10 毫秒的间隔:任务需要 30 毫秒,它会在第 10 毫秒执行,然后在第 40 毫秒执行(在第一个任务完成后立即执行)。

所以你不能真正锁定,但也没有其他东西可以竞争你的代码。

至于堆栈溢出:如果你真的有这种情况,例如。一个可能溢出 500 万行堆栈的递归函数(在 IE 中,页面加载期间执行的 Javascript 行数),您可以使用 0 的超时来延迟函数:

setTimeout(function () { }, 0);

这也是 underscore 的defer工作方式。

于 2013-03-01T00:49:30.910 回答