2016-01-18 2 views
1

Скажите, что у меня есть setInterval вызов с 10ms в качестве аргумента. Я запускаю его, и у меня есть код JavaScript, для выполнения которого требуется 25 мс. Через 10 мс первый обратный вызов интервала помещается в очередь. Через 20 мс нет ничего лишнего в очереди, потому что (предположим, что логика веб-API, если это то, где происходит отметка setInterval), один экземпляр setInterval уже поставлен в очередь.setInterval и цикл событий

Теперь, когда основная логика завершена, начинается setInterval, и требуется, скажем, 10 мс (так к тому времени, когда она завершится, 35 мс пройдет от выполнения программы). В 30 мс, тогда как обратный вызов setInterval находится в стеке и выполняется, появляется еще один тик. Что происходит сейчас? Будет ли еще один экземпляр очереди обратного вызова setInterval в очереди событий? Или будет ли среда браузера видеть, что в выполнении стека есть экземпляр интервала и пропустить нажатие нового экземпляра в очередь событий, тем самым делая следующий гаджет экземпляра setInterval в 40 мс. наконец нажимаем новый обратный вызов?

+0

Проверьте это, используя console.log, посмотрим, что произойдет – user2182349

+0

Можете ли вы показать свой сценарий здесь? –

+0

Невозможно создать код для проверки этого, если только не использовать некоторые высокоточные инструменты производительности, с которыми я не знаком. – daremkd

ответ

0

Как уже упоминалось в комментариях, JavaScript однопоточный. Чтобы продемонстрировать это, я тестировал этот код:

var count = 0; 
var interval = setInterval(function() { 
    if (count >= 5) { 
     clearInterval(interval); 
     return; 
    } 

    var start = Date.now(); 
    var number = ++count; 
    console.log("Call #" + number + " begin: " + start); 

    // Delay for 250 ms 
    while (Date.now() - start < 250) {} 

    var end = Date.now(); 
    console.log("Call #" + number + " end: " + end + " Interval: " + (end - start)); 
}, 1); 

И это выводит:

Call #1 begin: 1453087997262 
Call #1 end: 1453087997512 Interval: 250 
Call #2 begin: 1453087997522 
Call #2 end: 1453087997772 Interval: 250 
Call #3 begin: 1453087997777 
Call #3 end: 1453087998027 Interval: 250 
Call #4 begin: 1453087998027 
Call #4 end: 1453087998277 Interval: 250 
Call #5 begin: 1453087998277 
Call #5 end: 1453087998527 Interval: 250 

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

Call #1 begin 
Call #2 begin 
Call #3 begin 
Call #4 begin 
Call #5 begin 
// Approximate 245-250ms delay 
Call #1 end Interval: 250 
Call #2 end Interval: 250 
Call #3 end Interval: 250 
Call #4 end Interval: 250 
Call #5 end Interval: 250 

JSFiddle продемонстрировать : https://jsfiddle.net/Hatchet/126kkjwh/

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