我正在编写一个无处不在的插件,ajax 查询的长函数回调阻塞了 GUI 线程,导致 firefox 锁定。
显而易见的解决方案似乎是使用某种延迟执行(即,我们希望定期将执行此查询功能的执行添加到事件队列的末尾,然后允许执行其他命令。
我能想到的唯一方法是使用超时为零的 settimeout ......这是保证工作,还是有更好的方法来做到这一点。
我正在编写一个无处不在的插件,ajax 查询的长函数回调阻塞了 GUI 线程,导致 firefox 锁定。
显而易见的解决方案似乎是使用某种延迟执行(即,我们希望定期将执行此查询功能的执行添加到事件队列的末尾,然后允许执行其他命令。
我能想到的唯一方法是使用超时为零的 settimeout ......这是保证工作,还是有更好的方法来做到这一点。
使用setTimeout
非常小的超时(0
如果您感到偏执,则几乎为零)是在浏览器上下文中执行此操作的唯一方法。它工作得非常好并且非常可靠,但一定要经常产生,但不要太频繁,因为它确实需要一段时间才能回到你身边(当然,在计算机意义上的“一段时间”;它几乎是瞬时的 [模您可能正在做的其他事情] 以人类的方式)。
确保您使用的是异步请求,因为同步请求会阻止浏览器(这将解释 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)) {}