2013-12-18 3 views
3

Я создаю веб-приложение, которое позволяет пользователям управлять календарем (CRUD события, задачи, напоминания и т.д. ...)Javascript Timed Уведомления - SetTimeout, setInterval

и я пытаюсь реализовать функцию, где они будут получите всплывающее напоминание за минуту до события/задачи. В моем понимании есть на самом деле только один способ сделать это с помощью JavaScript:

При входе в систему, проверить наличие предстоящих событий в базе данных (скажем, в ближайшие 12 часов) и создать setTimeout для следующего события, когда это setTimeout выполняет, снова проверяет на следующее событие и так далее ...

Мой вопрос: будет ли иметь несколько setTimeouts (10+), работающих в фоновом режиме во время взаимодействия с пользователем, замедлить производительность моего приложения?

Есть ли лучший способ обработки всплывающих уведомлений на стороне клиента? Всплывающее уведомление? Любые предложения будут ценны!

+0

Почему у вас есть 10+ работает в фоновом режиме? Как вы сказали, установите тайм-аут для следующего события. Когда это срабатывает, проверьте следующее событие и установите новый таймер. – crad

+0

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

+1

Хорошо, возможно, вы имели в виду установить тайм-аут для нескольких событий одновременно, что быть ненужным. Звучит разумно. – crad

ответ

3

Мой вопрос: будет ли иметь несколько setTimeouts (10+), работающих в фоновом режиме во время взаимодействия с пользователем, замедлить работу моего приложения?

В этих номерах нет. (В зависимости от того, как ++ в 10+ есть. Я имею в виду, я ожидаю, миллион, вероятно, будет проблемой.)

Другой подход будет иметь один таймер, который вы используете (например, в минуту), чтобы проверить для уведомлений, которые должны произойти с этой минуты. Например:

function notifyForThisMinute() { 
    // Notify user of things we should notify them of as of this minute 
    // ... 

    // Schedule next check for beginning of next minute; always wait 
    // until we're a second into the minute to make the checks easier 
    setTimeout(notifyForThisMinute, (61 - new Date().getSeconds()) * 1000); 
} 
notifyForThisMinute(); // First call starts process 
+0

Да, я тоже подумал об этом, но не сделал бы много ненужных звонков на сервер, если бы не было событий за этот день? .... и я действительно не вижу ситуации, когда у меня будет больше 10, это у меня верхний предел –

+0

@AO: Я не говорил, что это был серверный звонок. :-) Вы можете загрузить информацию за следующие X минут и получить ее локально. –

+0

хорошая точка .... с точки зрения производительности это было бы так же, не так ли? один длинный запуск setTimeout против кучи последовательных более коротких? –

4

Это зависит от браузера (точнее, это механизм javascript) и, по-видимому, даже ОС.

Neil Thomas (while working on GMAIL mobile) и John Resig проанализировали таймеры.

Одна из наиболее заметных вещей, на которые нужно обратить внимание, заключается в том, как часто работает таймер за каждый интервал времени (скажем, каждые 200 мс или один раз каждые 10 минут ..).

Томас:

с низкочастотными таймеров - таймеры с задержкой менее одной секунды или более - мы могли бы создать много таймеров без значительного ухудшения производительности на любом [с Android G1 или iPhone 3G]. Даже при запланированном 100 таймерах наше приложение не было заметно менее отзывчивым. Однако с высокочастотными таймерами история была совершенно противоположной. Несколько таймеров, стрелявших каждые 100-200 мс, были достаточными, чтобы сделать наш интерфейс слабым.

Томас:

Имейте в виду, что этот код будет выполняться много раз в секунду. Зацикливание по массиву зарегистрированных обратных вызовов может быть слегка «чистым» кодом, но очень важно, чтобы эта функция выполнялась как можно быстрее. Жесткое кодирование вызовов функций также позволяет легко отслеживать всю работу, выполняемую в таймере.

Resig:

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

Можно также посмотреть на Chronos

+1

Я просто хотел добавить, что обе статьи, приведенные здесь, довольно старые (например, John's 7 лет), а таймеры улучшились во всех браузерах, так что информация в этом ответе не совсем правильная. – YemSalat

Смежные вопросы