2013-05-30 2 views
0

Я немного смущен таймерами в Javascript. Я играл с таймерами.путаница о таймерах в Javascript

Я смущен тем, как происходит процесс очередей в асинхронных событиях. Я прочитал статью о том, как асинхронные события в порядке. Но мне трудно обернуть голову вокруг процесса очередей.

Вот код:

http://jsbin.com/iwahuf/2/edit

В коде, который я разместил бы таймеры будут queud в последовательности. Разве таймеры в очереди событий не будут выполнены FIFO (First In, First Out).

Вот что я имею в виду в очереди событий.

  1. Первый таймер ж/500мс оттянуть
  2. Второй таймер ж/600мс оттянуть
  3. Третий Таймер ж/300мс оттянуть
  4. Четвертый таймер ж/400мс оттянуть

На мой взгляд, так как первый таймер был первым, который будет зарегистрирован в очереди событий, он будет первым, который будет выполнен, и только после 500 мс будет выполнен второй таймер и так далее.

Пожалуйста, просветите меня по этому вопросу. Я смущен. Я думаю, что мое понимание процесса очередей не совсем правильно.

Заранее спасибо.

ответ

2

Регистрация таймера не останавливает ваш код. Вы регистрируете все таймеры одновременно, планировщик будет пытаться выполнить их N мс после времени регистрации.

Это означает, что

  • Третий таймер настройка будет выполняться первые 300 мс после того, как ваш основной код выполняется
  • , то это будет четвертый 400 мс после того, как основной код был выполнен
  • то первый и второй

Если вы хотите поставить в очередь свои таймеры, вы их связываете (чтобы каждый из них вызывал следующий) или (намного легче и проще, если задачи короткие) y НУ вычислить себя времена:

var time = 0; 
setTimeout(function(){ 
    console.log("First Timer"); 
}, time += 500); 
setTimeout(function(){ 
    console.log("Second Timer"); 
}, time += 600); 
console.log("Executed immediately"); 
setTimeout(function(){ 
    console.log("Third Timer"); 
}, time += 300); 
setTimeout(function(){ 
    console.log("Fourth Timer"); 
}, time += 400); 

In this somewhat related answer Я даю реализацию простой очереди.

+0

Право. Нет очереди «таймеров». Если вы этого хотите, вам нужно реализовать это самостоятельно. То есть зарегистрируйте второй таймер в первом, чтобы добавить их. –

+0

Спасибо за ваш ответ. Я немного смущен вашим заявлением о том, что они выполняются одновременно. Разве Javascript не имеет нити, поэтому я думаю, что в очереди событий будет зарегистрировано только одно асинхронное событие или таймер. – chanHXC

+0

@chanHXC хорошо, не совсем то же самое время, но JS достаточно быстр, чтобы он чувствовал себя в одно и то же время. –

1

Нет, таймеры не являются первыми в первом порядке.

Это не сами таймеры, которые помещаются в очередь событий - когда таймеры заканчиваются, они приводят к событию с истекшим «таймером», которое добавляется в очередь событий FIFO по мере истечения срока их действия.

Как объекты таймера на самом деле обнаруживают, что они истекли и создают эти события, вне сферы действия и, вероятно, зависят от реализации.

+0

Здесь я могу исправить, так это значит, что код/​​процесс внутри таймера будет выполнен с задержкой N, а затем по истечении таймера должен быть зарегистрирован код/​​процесс в очередь событий, если браузер не будет свободен для выполнения что нибудь. – chanHXC

1

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

setTimeout(function(){ 
    console.log("First Timer"); 

    setTimeout(function(){ 
    console.log("Second Timer"); 

    setTimeout(function(){ 
     console.log("Third Timer"); 

     setTimeout(function(){ 
      console.log("Fourth Timer"); 
     }, 400); 

    }, 300); 

    }, 600); 

}, 500); 

console.log("Executed immediately"); 

Надеется, что это помогает!

+0

спасибо за ответ. Я думаю ты прав. , хотя я все еще немного смущен. – chanHXC

+0

Из ваших комментариев, мне кажется, что у вас есть достаточно хорошее понимание теории компьютеров, чтобы найти эту статью полезной: http://ejohn.org/blog/how-javascript-timers-work/ – Khior

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