Это интересный вопрос.
Асинхронное программирование - это парадигма программирования, которая в основном однопоточная, то есть «следует за одним потоком непрерывного выполнения».
Вы ссылаетесь на javascript, поэтому давайте обсудим этот язык в среде веб-браузера. Веб-браузер запускает один поток выполнения javascript в каждом окне, он обрабатывает события (такие как onclick = "someFunction ()") и сетевые подключения (такие как вызовы xmlhttprequest).
<script>
function performRequest() {
xmlhttp.open("GET", "someurl", true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
alert(xmlhttp.responseText);
}
}
xmlhttp.send(sometext);
}
</script>
<span onclick="performRequest()">perform request</span>
(Это нерабочий пример, только для демонстрации концепций).
Для того, чтобы сделать все асинхронно, управляющий поток имеет так называемый «основной цикл». Основной цикл выглядит примерно так:
while (true) {
event = nextEvent(all_event_sources);
handler = findEventHandler(event);
handler(event);
}
Важно отметить, что это не «занятый цикл». Это похоже на спящий поток, ожидающий активности. Активность может быть введена пользователем (движение мыши, нажатие кнопки, набор текста) или сетевая активность (ответ от сервера).
Так, в приведенном выше примере,
- Когда пользователь нажимает на диапазон, генерируется событие ButtonClicked, findEventHandler () находит событие onclick в теге span, а затем этот обработчик вызывается вместе с событием.
- Когда создается запрос xmlhttp, он добавляется в список источников событий all_event_sources.
- После того, как функция executeRequest () вернется, основной цикл ожидает на шаге nextEvent (), ожидая ответа. На данный момент ничто не блокирует дальнейшие события от обработки.
- Данные возвращаются с удаленного сервера, nextEvent () возвращает сетевое событие, обнаружено, что обработчиком событий является метод onreadystatechange (), этот метод вызывается, и запускается диалоговое окно alert ().
Стоит отметить, что alert () является блокирующим диалогом. Пока этот диалог открыт, дальнейшие события не могут быть обработаны. Эксцентричность модели веб-страниц на языке javascript заключается в том, что у нас есть готовый метод, который блокирует дальнейшее выполнение в контексте этой страницы.