ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Учебник по JavaScript: ч.1: Асинхронное программирование

Начал читать одиннадцатый раздел («Промисы, async/await») первой части («Язык программирования JavaScript») учебника по JavaScript.

https://learn.javascript.ru

Пока прочел из этого раздела только первый подраздел 11.1 «Введение: колбэки» учебника.

Названия

Указанные выше названия всего раздела и первого его подраздела вводят ученика в заблуждение. Думаю, этому одиннадцатому разделу следовало бы дать название «Асинхронное программирование», а не непонятное для новичка «Промисы, async/await», потому что речь в этом разделе идёт именно про методы асинхронного программирования.

Одним из методов асинхронного программирования в языке JavaScript является использование функций-колбэков (этот метод считается устаревающим, но еще кое-где используется).

Таким образом, название подраздела 11.1 «Введение: колбэки» учебника означает не то, что в этом подразделе будет дано введение в функции-колбэки (про эти функции уже было рассказано в подразделе 2.16 «Function Expression» учебника, а после этого такие функции использовались во множестве примеров и задач следующих разделов и подразделов учебника до подраздела 11.1; по-русски такие функции также называют «функциями обратного вызова»).

https://ru.wikipedia.org/wiki/Callback_(программирование)

А это означает то, что в этом подразделе будет дано введение в асинхронное программирование с использованием функций-колбэков. Следовало бы назвать данный подраздел как-то вроде 11.1 «Введение в асинхронное программирование: колбэки».

Однопоточность языка и асинхронные действия в средах

Вообще, язык JavaScript традиционно является однопоточным (по-английски «single-threaded»). Об этом сказано в следующей статье (тут ссылки на русскоязычный и англоязычный варианты статьи):

https://developer.mozilla.org/ru/docs/Learn/JavaScript/Asynchronous/Concepts
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Concepts

Однако, среды (например, браузер), в которых используется язык JavaScript, дают программистам возможность планировать асинхронные действия. Об этом сказано в англоязычной версии подраздела 11.1 учебника, цитата:

Many functions are provided by JavaScript host environments that allow you to schedule asynchronous actions. In other words, actions that we initiate now, but they finish later.

For instance, one such function is the setTimeout function.

There are other real-world examples of asynchronous actions, e.g. loading scripts and modules (we’ll cover them in later chapters).


В русскоязычной версии подраздела 11.1 учебника эти необходимые в начале подраздела пояснения скукожились до такого, запутывающего ученика, обрезка, цитата:

Многие действия в JavaScript асинхронные.


Синхронность и асинхронность выполнения кода

Что такое «синхронный код»? Это код, в котором все инструкции выполняются последовательно, каждая следующая инструкция выполняется после полного завершения предыдущей инструкции. В каждый момент времени может выполняться только одна инструкция, обрабатываемая в единственном (главном) потоке исполнения. Как я понимаю, синхронность тут заключается в том, что конец предыдущей инструкции синхронизирован с началом следующей инструкции, то есть между ними нет никакой паузы и следующая инструкция не может начаться раньше полного окончания предыдущей.

В асинхронном же программировании такая синхронизация инструкций необязательна. Следующая инструкция может начать выполняться раньше, чем полностью закончилось выполнение предыдущей инструкции.

Простейшим примером асинхронного программирования можно считать, как мне кажется, изученные ранее (в подразделе 6.8 «Планирование: setTimeout и setInterval» учебника) функции setTimeout и setInterval.

Как наличие этих функций сочетается с приведенным выше утверждением о том, что язык JavaScript — однопоточный? А эти функции не входят в спецификацию языка JavaScript, но эти функции предоставляются большинством сред (например, браузеров), в которых используется язык JavaScript (как об этом уже было сказано выше).

Пример 1. Синхронный код:
alert( "Инструкция 1" );
alert( "Инструкция 2" );

Пример 2. Асинхронный код:
setTimeout(() => alert( "Инструкция 1" ), 1000);
alert( "Инструкция 2" );

В первом примере сообщения в браузере появятся в таком порядке: «Инструкция 1», «Инструкция 2». Во втором же примере сообщения в браузере появятся в порядке, обратном тому, в котором они появились в коде: «Инструкция 2», «Инструкция 1».

Во втором примере видно и то, как в асинхронном программировании используются функции-колбэки.

В самом подразделе 11.1 пример асинхронного программирования построен на использовании объекта document, его свойств и методов. Этот объект представляет веб-страницу, загруженную в браузер. И, естественно, не входит в спецификацию языка JavaScript (как мы помним, этот язык является однопоточным), а предоставляется браузером, в среде которого используется язык JavaScript.

* * *

Этот объект document, по идее, будет изучаться только в следующей (второй) части учебника «Браузер: документ, события, интерфейсы» и его использование в этом подразделе, как мне кажется, не является правильным, потому что ученик пока еще о нем ничего не знает.

Кроме этого, в качестве задачи к данному подразделу взята задача из третьей части учебника (решение задачи из третьей части учебника (подраздел 5.2 «CSS-анимации») предлагается усовершенствовать). Зачем это сделано? Непонятно. Думаю, задачу придется отложить на потом, пока я не ознакомлюсь со второй и третьей частями учебника.
Tags: Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments