задний план:
1.数据展示页加一个自动刷新功能,让用户看到最新数据。
2.加个定时,过*(时间段)后执行,实现xx效果。
3.调整一下这几个事件响应的执行顺序等等。。。
В процессе разработки мы часто используем таймеры для выполнения определенных требований. js подготовил для нас две функции: setTimeout и setInterval, прежде чем перейти к теме, давайте кратко познакомимся с ними
1.setTimeout:
var timerId =setTimeout(function(){
//do
},delay)
2.setInterval
var timerId2 = setInterval(function() {
//do
}, delay)
//delay 时间周期
Во-первых, они оба возвращают целое число для представления таймера. Передайте это значение соответствующему методу очистки, чтобы отменить отсчет времени.
Во-вторых, setTimeoutожидатьВыполнить функцию после задержки (delay) мс, setIntervalожидатьФункция выполняется один раз в каждый интервал (задержку) мс.
Почему просто говорят ожидать этого? предыдущий 🌰 смотреть
var start_date = 0;
setTimeout(function(){
var end_date = new Date().getTime()/1000
console.log('enter setTimeout date : ' + end_date)
console.log('time interval : ' + (end_date - start_date) + '秒')
},1000)
function bulky(){
start_date = new Date().getTime()/1000;
console.log("bulky start date : " + start_date)
for(var i=0;i<100000;i++){
for(var j=0;j<100000;j++){
var k = 0;
k = k*k;
}
}
}
bulky()
Сначала предскажите результат, а затем запустите код, результат будет следующим:
Как реализован таймер? Почему возникают неровности?
Во-первых, мы должны очистить:JavaScript работает в одном потоке. Основное использование JavaScript — взаимодействие с пользователем и управление DOM. Конфликты могут возникать в многопоточном режиме. Предположим, что с элементом DOM одновременно работают два потока. Поток 1 требует от браузера удалить DOM, а поток 2 требует изменения стиля DOM. В настоящее время браузер не может решить, какой поток использовать. Конечно, мы можем ввести механизм «блокировки» для браузера для разрешения этих конфликтов, но это значительно увеличивает сложность, поэтому JavaScript с самого своего рождения выбрал однопоточное выполнение. В определенное время может выполняться только одна конкретная задача, и она будет блокировать выполнение других задач.
Но в JavaScript есть модель параллелизма (а не параллелизма), основанная на «Цикле событий». Первое — логическое совпадение, второе — физическое совпадение. Следовательно, одноядерный процессор также может обеспечить параллелизм.
Приведенная выше диаграмма иллюстрирует параллелизм и параллелизм:
Давайте проиллюстрируем цикл событий с помощью рисунка выше.
Поскольку js является однопоточным, это означает, что все задачи должны быть поставлены в очередь. Все задачи можно разделить на два типа, одна — синхронная задача (sync), другая — асинхронная задача (asynchronous)
-
Синхронные задачи относятся к задачам, поставленным в очередь для выполнения в основном потоке.Только когда выполняется предыдущая задача, может выполняться следующая задача, формируя стек контекста выполнения.
-
Асинхронные задачи относятся к задачам, которые не входят в основной поток, а входят в «очередь задач» (task queue). «Очередь задач» — это очередь событий (которую можно понимать как очередь сообщений). Когда устройство ввода-вывода завершает задачу или асинхронная задача имеет текущий результат, в «очередь задач» добавляется событие, указывающее, что связанная операция может войти в «стек выполнения», и она ожидает вызова стека выполнения. .
Ссылаясь на схему Event Loop, давайте поговорим об общем процессе ----> Функции потокового выполнения (задачи синхронизации) в стеке выполнения, могут вызываться API для добавления событий (onlick, onload и т. д.) в очередь задач но не казнен. Только когда в текущем стеке выполнения нет другой операции, очередь задач будет помещена в стек выполнения, и выполнение будет выполнено.
С принципом покончено, вернемся к теме.Поскольку setTimeout и setInterval являются асинхронными задачами, они не войдут в стек выполнения сразу после вызова, а попадут в очередь задач, поэтому они войдут в стек выполнения для выполнения только тогда, когда в текущем стеке выполнения нет других операций.Это причины, по которым таймеры не всегда синхронизированы.
Да, кстати, если период задержки установлен на 0, это эквивалентно операции сокращения очереди
Пример
🌰 Предложение:
function f1(){
console.log('f1')
}
function f2(){
console.log('f2')
}
function f3(){
console.log('f3')
setTimeout(function(){
console.log('setTimeout1')
},2000)
}
setTimeout(function(){
console.log('setTimeout2')
},3000)
setTimeout(function(){
console.log('setTimeout3')
},1000)
setTimeout(function(){
console.log('setTimeout4')
},0)
f1()
f2()
f3()
результат операции
Воспроизведение без моего разрешения запрещено. В статье есть упущения и поверхностность, прошу меня поправить