8

我正在编写一个无处不在的插件,ajax 查询的长函数回调阻塞了 GUI 线程,导致 firefox 锁定。

显而易见的解决方案似乎是使用某种延迟执行(即,我们希望定期将执行此查询功能的执行添加到事件队列的末尾,然后允许执行其他命令。

我能想到的唯一方法是使用超时为零的 settimeout ......这是保证工作,还是有更好的方法来做到这一点。

4

2 回答 2

8

使用setTimeout非常小的超时(0如果您感到偏执,则几乎为零)是在浏览器上下文中执行此操作的唯一方法。它工作得非常好并且非常可靠,但一定要经常产生,但不要频繁,因为它确实需要一段时间才能回到你身边(当然,在计算机意义上的“一段时间”;它几乎是瞬时的 [模您可能正在做的其他事情] 以人类的方式)。

于 2009-09-20T21:48:07.153 回答
3

确保您使用的是异步请求,因为同步请求会阻止浏览器(这将解释 GUI 锁定)。

如果这不是你的问题,我想你想要这样的任务队列。

var queue = [];

queue.push(someTaskFunction);
queue.push(anotherTaskFunction);
// ...

var runQueue = (function () {
    var len = queue.length, task = 0;
    for (; task < len; task++) {
        yield queue[task]();
    }
}());

调用runQueue.next()以执行下一个任务。将其包装在 try..catch 语句中,如下所示:

try {
    runQueue.next();
} catch (e if (e instanceof StopIteration)) {}
于 2009-09-20T22:02:05.760 回答