使用setTimeout来模拟并行操作有什么本质上的错误吗?

时间:2009-08-28 18:23:08

标签: javascript blocking user-experience

当此应用的用户对字段进行更改时,需要在其他字段中进行大量更改。通常,即使使用优化的脚本,浏览器也会在IE中阻止用户输入超过1秒。为了防止发生,我这样做:

var i = 100;
GetTextInputs().filter('[' + name + ']').each(function()
{    
    setTimeout("DoWork('" + this.id + "', '" + v + "', '" + name + "');", i);
    i += 25;
});

对我来说这感觉很讨厌,但效果很好。

  • 这种方法有什么问题吗?
  • 或者,有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

现在,我认为你实际上没有多少选择。

我没有检查你的功能是否正常工作,但是使用setTimeout并将工作分成小块可能是要走的路。


但是,将来你可能会使用Web Workers;引自Mozilla's webpage

  

工作人员为网络提供了一种简单的方法   在后台运行脚本的内容   线程。一旦创建,工人就可以   通过发送消息到产卵任务   将消息发布到事件处理程序   由创作者指定。

     

工作线程可以执行任务   不干扰用户   接口。另外,他们可以   使用XMLHttpRequest执行I / O.   (虽然responseXML和频道   属性始终为null)。

并且:

  

工人有用的一种方法是允许   你的代码要执行   处理器密集型计算   不阻止用户界面   线程。

这些已在Firefox 3.5中提供,我认为它们也是由Google Gears提供的 - 但它们还没有广泛使用,所以你可能不应该在几年前使用它们,至少对于一个应用程序由“任何人”使用: - (

答案 1 :(得分:3)

可能出现严重错误的一件事是,拥有太多高频定时器可能会[讽刺地]使ui迟缓/反应迟钝。来自http://googlecode.blogspot.com/2009/07/gmail-for-mobile-html5-series-using.html

  

使用低频定时器 - 定时器   延迟一秒或更长时间 -   我们可以创建许多计时器   显着降低性能   任一设备。即使有100个计时器   预定,我们的应用程序并不明显   反应迟钝。随着高频率   然而,计时器的确如此   相反的。一些计时器射击   每100-200毫秒就足够了   让我们的UI感觉迟钝。

答案 2 :(得分:1)

为了获得更好的用户体验,我使用了setTimeout,以便尽可能多地在后台进行工作。

在Windows中类似于在主事件线程上运行所有内容。将应用程序从该线程中移除是更多的工作,但最终用户将获得更好的体验。

唯一可能出错的事情是,如果你在setTimeout中实际使用变量之前有变量,那么动作可能会有所不同。

所以如果你看到一些奇怪的行为,你至少可以意识到这一点。理想情况下,您的设计不应该允许它,但它可能会发生。