2015-04-18 4 views
3

Если я зарегистрировал трудоемкую функцию обратного вызова слушателю событий, и это событие будет запущено дважды за короткий период. Будет ли второй обратный вызов заблокирован первым?Является ли блокировка запросов JavaScript?

Я попробовал это в браузере:

document.body.onclick = function() { 
    var date = new Date; 
    console.log('click event at ' + date); 

    while(new Date - date < 1e4) {}; 

    console.log('callback end'); 
} 

В результате, второй обратный вызов был выполнен сразу после первой один сделано.

Итак, теперь я смущаюсь с неблокирующим асинхронным модулем JavaScript: какая часть была выполнена асинхронно?

ответ

7

Javascript в браузере - однопоточный и работает в очереди событий. Одно событие завершится до того, как будет запущено следующее событие. Таким образом, если второй клик возникает, когда первый все еще обрабатывается, второй щелчок будет поставлен в очередь и не будет работать до тех пор, пока не будет обработан первый код.

Вы можете прочитать больше об этом событии концепции очереди здесь:

How does JavaScript handle AJAX responses in the background?


В вашем конкретном примере, как только ваш код начинает работать, это все синхронными. Цикл while выполняется до завершения и блокируется (при этом любой другой Javascript работает до его завершения).

Есть асинхронные способы запланировать запуск какого-либо кода в будущем (используя setTimeout() или setInterval()), что позволит другому коду работать в то же время, но вы не используете этот механизм.

+0

Спасибо за anwser! Согласно ссылке ссылки, даже я поместил трудоемкий блок кода в 'setTimeout()', он все равно будет блокировать поток, пока исполняемый код внутри таймера будет выполнен, и предотвратит запуск следующего обратного вызова в очереди до тех пор, пока это не будет выполнено , Это правильно? –

+0

@ Dolphin_Wood - да, это так. Пока часть кода запущена, другим событиям придется подождать, пока этот код не будет выполнен, прежде чем они вернутся к своей очереди. – jfriend00

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