предисловие
Только что дочитал "JS Ninja Cheats" некоторое время назад.Хоть он и вышел за 15 лет, некоторые вещи устарели, но не устарели такие механизмы как цепочка прототипов, замыкание, регулярность, таймер и т.д. Это. Все очень подробно, и это стоит прочитать. В этой статье будет подробно разобран механизм таймера в этой книге. Если вам это нравится, вы можете поставить лайк / подписаться и поддержать его. Я надеюсь, что вы сможете прочитать эту статью. Получите что-то .
Личный блог, чтобы узнать:obkoro1.com
Подготовить
Перед прочтением этой статьи рекомендуется прочитатьМеханизм цикла событий Js (Event Loop) и объяснение примераЭта статья предназначена для того, чтобы понять, что происходит за кулисами, и не будет подробно объяснять механизм цикла событий.
Проблема, решаемая таймером:
Из-за однопоточной природы JS таймеры предоставляют способ обойти ограничение однопоточности, то есть позволить части кода выполняться асинхронно через определенную миллисекунду.
Чтобы установить и очистить таймер:
Цитирование изображения непосредственно из читов Ninja:
Уведомление:
- Интервал таймера установлен на 0, а также будет задержка в несколько миллисекунд.
- В использовании
setTimeout
а такжеsetInterval
Когда лучше присвоить его переменной, чтобы отменить таймер. - В использовании
Vue
когда,setTimeout
а такжеsetInterval
Это указывает на объект окна, а данные и методы компонента недоступны. - В использовании
Vue
Когда маршрутный переход не уничтоженsetInterval
, но компонент уже уничтожен, что и вызывает проблему. - в потоке выполнения
setTimeout
/setInterval
Нет гарантии, что функция обратного вызова будет выполнена вовремя. -
setInterval
звонки могут быть устаревшими иsetInterval
непрерывное выполнение
Решения третьего и четвертого пунктов могут относиться к тому, что я писал ранееНесколько проблем в процессе практики Vue.
Далее мы поговорим о пятом и шестом пунктах, Эти два пункта являются наиболее важными и содержанием, анализу которых будет посвящена данная статья.
Выполнение таймера в потоке выполнения
Давайте посмотрим на каштаны в читах ниндзя:
Давайте посмотрим, что здесь происходит:
- Во-первых, в 0 миллисекунд есть блок кода js, выполнение которого длится 18 миллисекунд.
- Затем установите два таймера с задержкой 10 миллисекунд на 0 миллисекунд,
setTimeout
так же какsetInterval
,setTimeout
Сначала установите. - На 6-й миллисекунде происходит событие щелчка мышью.
События поставлены в очередь.
Так много вещей происходит одновременно из-за однопоточной природы js,Когда поток выполняется и запускается асинхронное событие, оно будет поставлено в очередь и выполнено, когда поток простаивает..
这里的异步事件包括:鼠标单击,定时器触发,ajax请求、promise等事件。
Вернемся к каштану:
В кашнете есть код кодового блока 18 миллисекунд, который должен быть выполнен в первую очередь, и только этот блок кода можно выполнить в течение этих 18 миллисекунд.После запуска других событий их можно только поставить в очередь на выполнение..
Пока блок кода все еще выполняется, на 6-й миллисекунде происходит событие щелчка мыши, а на 10-й миллисекунде происходит событие щелчка мыши.setTimeout
а такжеsetInterval
Два обработчика, эти три события не могут быть выполнены сразу, нодобавляется в очередь, ожидающую выполнениясередина.
Первый пришел, первый ушел (первый пришел, первый вышел)
В 18 мс блок кода завершает выполнение, и три задачи ставятся в очередь на выполнение.Принцип «первым пришел – первым вышел», в это время событие клика будет выполняться первым,setTimeout
а такжеsetInterval
будет по-прежнему стоять в очереди на выполнение.
вызов setInterval устарел
При выполнении события клика первые 20 миллисекунд, вторыеsetInterval
Он также истек, потому что в это время событие клика заняло поток, поэтомуsetInterval
до сих пор не может быть выполнено, и поскольку в настоящее времяВ очереди уже естьsetInterval
ставится в очередь на выполнение, поэтому на этот разsetInterval
будет устаревшим.
Браузер не будет добавлять один и тот же обработчик setInterval в очередь ожидания несколько раз.
setTimeout
/setInterval
Нет гарантии, что функция обратного вызова будет выполнена вовремя
Событие щелчка завершает выполнение на 28-й миллисекунде с двумя задачами (setTimeout
а такжеsetInterval
) ожидает выполнения в соответствии с принципом «первым пришел — первым вышел».setTimeout
Раньше чемsetInterval
установить, поэтому выполнить сначалаsetTimeout
.
so:Что мы ожидаем выполнить на 10-й миллисекундеsetTimeout
Обработчик в конечном итоге начнет выполняться на 28-й миллисекунде., о котором сказано вышеsetTimeout
/setInterval
Нет гарантии, что функция обратного вызова будет выполнена вовремя.
В 30 мс,setInterval
Срабатывает снова, потому что в очереди уже естьsetInterval
В очереди, поэтому этот триггер снова недействителен.
Непрерывное выполнение setInterval
setTimeout
Выполнение завершается через 36 мс.setInterval
Обработчик начинает выполняться,setInterval
Выполнение занимает 6 миллисекунд.
на 40-й миллисекундеsetInterval
запустить снова, потому что на этот разПредыдущийsetInterval
Во время выполнения в очереди нет очередиsetInterval
В очереди на этот раз триггерsetInterval
будет ждать в очереди.
так:setInterval
Время обработки не может быть больше установленного интервала, иначеsetInterval
Повторное исполнение не будет промежуточным
На 42-й миллисекунде,ПервыйsetInterval
конец, затем очередьsetInterval
начать выполнение немедленно, завершает выполнение за 48 миллисекунд. Затем он снова срабатывает через 50 миллисекунд.setInterval
, в это время в очереди нет задач, и они будут выполнены немедленно.
setTimeout периодически запускает таймер через определенный интервал.
Сказано выше,setInterval
Время обработки не может быть больше установленного интервала, иначеsetInterval
будет повторяться без интервала.
Но для этой задачи во многих случаях мы не можем четко контролировать время, затрачиваемое программой обработки, чтобы мы моглиПериодически запускать таймер через определенный интервал, в читах ниндзя предусмотрен следующий метод:
// 实际上我不止在忍者秘籍中见过,在很多地方都见过这种技术。
setTimeout(function repeatMe(){
// do something
setTimeout(repeatMe,10);
// 执行完处理程序的内容后,在末尾再间隔10毫秒来调用该程序,这样就能保证一定是10毫秒的周期调用
},10)
Дополнительные знания о таймерах в Ninja Читы:
- Таймер не может очень точно контролировать время выполнения, и в книге рекомендуется более 15 мс.
- Таймеры можно использовать для разбивки длительных задач, здесь вы можете сами погуглить.
Является ли очередь задач такой же простой, как и очередь?
На самом деле очередь задач — это не просто очередь, в читах ниндзя упоминается, что это понятие используется для удобства, и если вы хотите иметь более четкое представление о механизме, стоящем за ним, рекомендуется прочитать его еще раз:Механизм цикла событий Js (Event Loop) и объяснение примера,
Эпилог
Все вышеперечисленное вызвано однопоточной особенностью js, поэтому будет очередь событий, первый пришел первый обслуженный, вызовы setInterval отброшены, таймеры не могут гарантировать пунктуальное выполнение функций обратного вызова, и происходит непрерывное выполнение setInterval, всегда помните об этой особенности, многие проблемы, связанные с порядком выполнения событий, можно выяснить и найти решения.
Я надеюсь, что друзья, которые прочитали это, могут нажать «Нравится» / «Подписаться», ваша поддержка — самая большая поддержка для меня.
личный блог and Персональная домашняя страница Nuggets, если вам нужно перепечатать, пожалуйста, поставьте ссылку на исходный текст и подпишите его. Кодировать не просто,благодарныйслужба поддержки! Я пишу статью с менталитетом биржевых записей, и не хочу ее рвать, но приветствую подсказки.
Если вам понравилась эта статья, обратите внимание на мой номер подписки, долгий путь к технологиям и с нетерпением ждите совместного обучения и роста в будущем.
Выше 2018.6.17
Использованная литература:
JS Ninja Cheats Глава 8: Укрощение потоков и таймеров