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