Есть ли что-то не так с использованием setTimeout для симуляции параллельного действия? - PullRequest
4 голосов
/ 28 августа 2009

Когда пользователи этого приложения вносят изменения в поля, большое количество изменений должно произойти в других полях. Как правило, даже с оптимизированными сценариями браузер блокирует ввод пользователя на 1 секунду и более в IE. Чтобы прекратить происходить, я делаю это:

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

Мне это кажется хакерским, но прекрасно работает.

  • Может ли что-то пойти не так с этим методом?
  • В качестве альтернативы, есть ли лучший способ?

Ответы [ 3 ]

3 голосов
/ 28 августа 2009

Одна вещь, которая может пойти ужасно неправильно, состоит в том, что слишком много высокочастотных таймеров может [иронически] сделать пользовательский интерфейс вялым / не отвечающим. От http://googlecode.blogspot.com/2009/07/gmail-for-mobile-html5-series-using.html:

с низкочастотными таймерами - таймерами с задержкой в ​​одну секунду или более - мы могли бы создать много таймеров без значительно ухудшает производительность на любое устройство. Даже с 100 таймерами запланировано, наше приложение не было заметно менее отзывчивый. С высокой частотой таймеры, однако, история была точно противоположный. Несколько таймеров стрельбы каждые 100-200 мс было достаточно, чтобы заставить наш интерфейс чувствовать себя вялым.

3 голосов
/ 28 августа 2009

Прямо сейчас, я не думаю, что у вас есть большой выбор, на самом деле.

Я не проверял, работала ли ваша функция, но использование setTimeout и разбиение работы на небольшие куски, вероятно, является подходящим способом.


Однако в будущем вы можете использовать для этого Web Workers ; цитирование с веб-страницы Mozilla :

Работники предоставляют простые средства для веб контент для запуска скриптов в фоновом режиме потоки. После создания работник может отправлять сообщения в нерестовую задачу отправка сообщений в обработчик событий указано создателем.

Рабочий поток может выполнять задачи без вмешательства пользователя интерфейс. Кроме того, они могут выполнить ввод / вывод с использованием XMLHttpRequest (хотя responseXML и канал атрибуты всегда нулевые).

И:

Один из способов, с помощью которого работники полезны, - это разрешить ваш код для выполнения ресурсоемкие вычисления без блокировки пользовательского интерфейса нить.

Они уже доступны в Firefox 3.5, и я думаю, что они также предоставляются Google Gears - но они еще не широко доступны, поэтому вам, вероятно, не стоит использовать их пару лет, по крайней мере, для приложения используется кем угодно: - (

1 голос
/ 28 августа 2009

Для лучшего пользовательского опыта я много использую setTimeout, чтобы как можно больше работы выполнялось в фоновом режиме.

В Windows это похоже на то, что все выполняется в главном потоке событий. Это больше работы, чтобы получить приложение из этого потока, но в конечном итоге пользователь получит лучший опыт.

Единственное, что может пойти не так, это то, что если у вас есть изменение переменной до ее фактического использования в setTimeout, то действие может быть другим.

Так что вы можете хотя бы знать об этом, если увидите какое-то странное поведение. В идеале ваш дизайн не должен этого допустить, но это может произойти.

...