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

  • Параллелизм относится к событиям, происходящим в неопределенном порядке. Многозадачность - выполнение нескольких программ путем чередования инструкций посредством квантования времени - хороший способ задуматься об этом смысле параллелизма.
  • Параллелизм (или «настоящий» параллелизм) относится к вещам, происходящим буквально в одно и то же время. Для этого требуется аппаратная поддержка (сопроцессоры, многоядерные процессоры, сетевые машины и т. Д.). Весь параллелизм является параллельным, но не весь параллелизм является параллельным.

Итак, как мы реализуем задачи параллелизма? Что ж, обычно есть 2 способа решить эту проблему:

  • блокировка (синхронно). Этот шаблон в значительной степени зависит от многопоточности, поскольку он должен продолжать обслуживать запросы пользователей независимо от того, заблокирован один из потоков в списке или нет. Стиль блокировки в основном останавливает выполнение потока и ожидает завершения задачи, прежде чем продолжить работу с этим потоком. PHP, Ruby и большинство серверных технологий реализуют этот подход. Поскольку все выполняется последовательно, код, написанный по этому шаблону, читается, а также его проще реализовать и поддерживать.
  • неблокирующий (цикл событий). Этот стиль основан на одном потоке - все выполняется в этом одном потоке - это означает, что мы не можем заблокировать поток, иначе программа устареет, пока поток не будет разблокирован. Этот шаблон особенно хорош, потому что мы получаем очень высокий уровень параллелизма при низком потреблении памяти. Это также очень удобно для пользователей, поскольку в приложении всегда есть непрерывный поток. Вот почему это стиль шаблона, принятый браузерами и, конечно же, JavaScript.

Давайте объясним неблокирование (способ JavaScript) на примере. Представьте, что вам нужно показать данные пользователя в их профиле, который включает дату рождения, местоположение, возраст, но вы сохранили эти данные в разных ветвях своей базы данных, поэтому вам нужно отправить несколько HTTP-запросов, чтобы получить все необходимые данные (это не то, как вы обычно сохраняете данные в базе данных, а пытаетесь указать на это).

Давайте посмотрим, почему мы получаем только местоположение и возраст, а не доб.

Хотя они выполняются последовательно, это не означает, что мы получаем данные до запуска следующей функции. Чтобы исправить это, нам нужно понимать await / async и prom.all.

Слово async перед функцией означает, что функция всегда возвращает обещание. Другие значения автоматически заключаются в обработанное обещание.

Ключевое слово await заставляет JavaScript ждать, пока это обещание не исполнится, и возвращает свой результат.

Когда нам нужно дождаться нескольких обещаний, мы можем заключить их в Promise.all, а затем ждать.