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

use*_*741 6 javascript ubiquity settimeout reactor

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

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

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

T.J*_*der 8

使用setTimeout非常小的超时(0如果您感觉偏执,则非常接近零)是在浏览器上下文中执行此操作的唯一方法.它的工作原理非常好,是非常可靠的,但一定要产生往往不够,但不是频繁,因为它需要一段时间才能回来给你("一段时间",在电脑的意义,当然,它几乎瞬间[模在人类方面你可能正在做的其他事情).

  • 所有现代浏览器实现都将setTimeout钳位到~10ms(在所有非Windows系统上基本上都是10ms,其中获得<16ms定时器所需的定时器分辨率具有显着的功率使用影响).所以你真的不需要担心缩短超时. (2认同)
  • @olliej:这是过时的信息(如果它在 09 年是正确的,但这也不是我当时的经验)。浏览器会做比这更复杂的处理,这取决于 `setTimeout` 调用的来源。这是 [几年前在 HTML5 规范中编纂的](http://www.w3.org/TR/html5/webappapis.html#timer-initialization-steps) 但正如我所说,供应商已经在玩了(不同的) 在那之前的比赛。简短版本:如果您的代码没有被计时器调用,您可以使用 0,而现代浏览器将 ** 非常** 接近该值。 (2认同)