有没有一种正确的方法来在javascript的协作线程意义上“屈服”?

时间:2009-09-20 21:31:23

标签: javascript settimeout ubiquity reactor

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

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

我能想到这样做的唯一方法就是使用超时为零的settimeout ...这是保证可行的,还是有更好的方法。

2 个答案:

答案 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)) {}