Понимание синхронного и асинхронного JavaScript - часть 1
синхронный а также асинхронный сбивают с толку концепции в JavaScript, особенно для начинающих. Две или более вещи синхронный когда они случиться одновременно (синхронно) и асинхронный, когда они этого не делают (не синхронизировано).
Хотя эти определения легко принять, на самом деле все сложнее, чем кажется. Мы должны принять во внимание что именно синхронизировано, а также что не.
Вы, вероятно, позвоните нормальный
функция в JavaScript синхронна, верно? И если это что-то вроде SetTimeout ()
или AJAX, с которым вы работаете, вы будете называть его асинхронным, да? Что если я скажу тебе это и то и другое асинхронны в некотором смысле?
Чтобы объяснить Зачем, нам нужно обратиться к мистеру Икс за помощью.
Сценарий 1 - г-н Х пытается синхронность
Вот настройки:
- Мистер Х - это тот, кто может ответить на сложные вопросы и выполнить любое задание.
- Единственный способ связаться с ним через телефонный звонок.
- Какой бы вопрос или задание вы не получили, чтобы попросить господина Икс помочь выполнить его; ты звонишь ему.
- Мистер Икс дает вам ответ или выполняет задание сразу, и дает вам знать это сделано.
- Вы подавляете приемник, чувствуя себя довольным, и отправляетесь в кино.
То, что вы только что выполнили, было синхронное (туда и обратно) общение с мистером X. Он слушал, когда вы задавали ему свой вопрос, и вы слушали, когда он отвечал на него.
Сценарий 2 - Мистер Икс не доволен синхронностью
Поскольку г-н Х очень эффективен, он начинает получать гораздо больше звонков. Так что же происходит, когда вы звоните ему, но он уже занят разговаривать с кем-то еще? Вы не сможете задать ему свой вопрос - пока он не получит ваш звонок. Все, что вы услышите, это занятый тон.
Так что же г-н Х может сделать, чтобы бороться с этим?
Вместо того, чтобы принимать звонки напрямую:
- Мистер Х нанимает нового парня, мистера М, и дает ему автоответчик для звонящих оставлять сообщения.
- Мистер М передать сообщение от автоответчика до г-на Х, когда он узнает, что г-н Х полностью завершил обработку всех предыдущих сообщений и уже бесплатно взять новый.
- Так что теперь, когда вы звоните ему, вместо того, чтобы получить сигнал "занято", вы можете оставить сообщение для мистера X, а затем подожди пока он тебе перезвонит (пока нет фильма).
- Как только мистер X закончит со всеми сообщениями в очереди, которые он получил до вашего, он рассмотрит вашу проблему и Вам позвоним дать вам ответ.
Теперь здесь лежит вопрос: были ли действия до сих пор синхронный или асинхронный?
Это смешано. Когда вы оставили свое сообщение, Мистер Икс не слушал его, поэтому четвертое сообщение было асинхронным.
Но когда он ответил, ты был там слушал, который делает обратную связь синхронной.
Я надеюсь, что к настоящему времени вы приобрели лучшее понимание того, как синхронность воспринимается с точки зрения коммуникации. Время вводить в JavaScript.
JavaScript - язык асинхронного программирования
Когда кто-то помечает JavaScript как асинхронный, то, на что он ссылается в целом, - это то, как вы можете оставить сообщение за это и не заблокирован ваш звонок с занятым тоном.
Вызовы функций никогда не направлять в JavaScript, они буквально сделаны через сообщения.
JavaScript использует очередь сообщений где хранятся входящие сообщения (или события). событие-цикл (диспетчер сообщений) последовательно отправляет эти сообщения стек вызовов где соответствующие функции сообщений сложены как кадры (аргументы функции и переменные) для выполнения.
Стек вызовов содержит фрейм исходной вызываемой функции и любые другие фреймы для вызываемых функций. через вложенные звонки на нем .
Когда сообщение присоединяется к очереди, оно ожидает, пока стек вызовов пусто из всех кадров из предыдущего сообщения, и когда это происходит, цикл обработки событий удаляет предыдущее сообщение, и добавляет соответствующие кадры текущего сообщения в стек вызовов.
Сообщение снова ждет, пока стек вызовов не станет пустые собственные соответствующие кадры (то есть выполнение всех стековых функций завершено), затем снимается с очереди.
Рассмотрим следующий код:
function foo () function bar () foo (); function baz () bar (); baz ();
Запускаемая функция Баз ()
(в последнем ряду фрагмента кода), для которого сообщение добавлено в очередь, и когда цикл обработки событий подхватывает его, стек вызовов начинает укладывать кадры за Баз ()
, бар()
, а также Foo ()
в соответствующих точках исполнения.
Когда выполнение функций завершено одна за другой, их кадры удален из стека вызовов, пока сообщение все еще жду в очереди, до тех пор Баз ()
выскочил из стека.
Помните, что вызовы функций никогда не направлять в JavaScript, они сделали через сообщения. Поэтому всякий раз, когда вы слышите, как кто-то говорит, что JavaScript сам по себе является языком асинхронного программирования, предполагайте, что он говорит о его встроенном “автоответчик”, и как ты можешь оставлять сообщения.
Но как насчет конкретных асинхронных методов?
До сих пор я не касался таких API, как SetTimeout ()
и AJAX, это те, которые конкретно упоминается как асинхронный. Это почему?
Важно понимать, что именно является синхронным или асинхронным. JavaScript, с помощью событий и цикла обработки событий, может практиковать асинхронная обработка сообщений, но это не значит все в JavaScript асинхронный.
Помните, я говорил вам, что сообщение не отправлялось до тех пор, пока пустой из соответствующих кадров, так же, как вы не ушли в кино, пока не получили ответ - это быть синхронным, ты там ждешь пока задача не будет завершена, и вы получите ответ.
ждущий не идеален во всех сценариях. Что если после оставления сообщения вместо ожидания вы можете уйти в кино? Что если функция может выйти из системы (очистить стек вызовов), а ее сообщение может быть удалено из системы еще до завершения задачи функции? Что делать, если вы можете иметь код, выполняемый асинхронно?
Это где API, такие как SetTimeout ()
и AJAX входят в картину, и то, что они делают, это ... держись, я не могу объяснить это, не возвращаясь к мистеру X, который мы увидим во второй части этой статьи. Оставайтесь в курсе.