Fetch
JavaScript может отправлять сетевые запросы на сервер и подгружать новую информацию по мере необходимости.
Например, мы можем использовать сетевой запрос, чтобы:
- Отправить заказ
- Загрузить информацию о пользователе
- Запросить последние обновления с сервера
- …и т.п.
Метод
Базовый синтаксис:
-
-
Без options это простой GET-запрос, скачивающий содержимое по адресу url.
#fetch #сетевые_запросы
JavaScript может отправлять сетевые запросы на сервер и подгружать новую информацию по мере необходимости.
Например, мы можем использовать сетевой запрос, чтобы:
- Отправить заказ
- Загрузить информацию о пользователе
- Запросить последние обновления с сервера
- …и т.п.
Метод
fetch()
— современный и очень мощный, поэтому начнём с него. Он не поддерживается старыми (можно использовать полифил), но поддерживается всеми современными браузерами.Базовый синтаксис:
-
url
– URL для отправки запроса.-
options
– дополнительные параметры: метод, заголовки и так далее.Без options это простой GET-запрос, скачивающий содержимое по адресу url.
#fetch #сетевые_запросы
👍3
Прокрутка
Встроенное свойство «length» содержит количество параметров функции в её объявлении.
Событие прокрутки
Есть много хороших вещей, которые при этом можно сделать.
Например:
- Показать/скрыть дополнительные элементы управления или информацию, основываясь на том, в какой части документа находится пользователь.
- Подгрузить данные, когда пользователь прокручивает страницу вниз до конца.
Вот картинке выше функция для отображения текущей прокрутки.
#прокрутка #интерфейсные_события
Встроенное свойство «length» содержит количество параметров функции в её объявлении.
Событие прокрутки
scroll
позволяет реагировать на прокрутку страницы или элемента. Есть много хороших вещей, которые при этом можно сделать.
Например:
- Показать/скрыть дополнительные элементы управления или информацию, основываясь на том, в какой части документа находится пользователь.
- Подгрузить данные, когда пользователь прокручивает страницу вниз до конца.
Вот картинке выше функция для отображения текущей прокрутки.
#прокрутка #интерфейсные_события
👍6
Глобальный catch
Давайте представим, что произошла фатальная ошибка (программная или что-то ещё ужасное) снаружи
Существует ли способ отреагировать на такие ситуации?
Можно залогировать ошибку, показать что-то пользователю (обычно они не видят сообщение об ошибке) и т.д.
В браузере мы можем присвоить функцию специальному свойству window.onerror, которая будет вызвана в случае необработанной ошибки.
Синтаксис на картинке выше.
-
Сообщение об ошибке.
-
URL скрипта, в котором произошла ошибка.
-
Номера строки и столбца, в которых произошла ошибка.
-
Объект ошибки.
Роль глобального обработчика window.onerror обычно заключается не в восстановлении выполнения скрипта – это скорее всего невозможно в случае программной ошибки, а в отправке сообщения об ошибке разработчикам.
#глобальный_catch #обработка_ошибок
Давайте представим, что произошла фатальная ошибка (программная или что-то ещё ужасное) снаружи
try..catch
, и скрипт упал.Существует ли способ отреагировать на такие ситуации?
Можно залогировать ошибку, показать что-то пользователю (обычно они не видят сообщение об ошибке) и т.д.
В браузере мы можем присвоить функцию специальному свойству window.onerror, которая будет вызвана в случае необработанной ошибки.
Синтаксис на картинке выше.
-
message
Сообщение об ошибке.
-
url
URL скрипта, в котором произошла ошибка.
-
line
, col
Номера строки и столбца, в которых произошла ошибка.
-
error
Объект ошибки.
Роль глобального обработчика window.onerror обычно заключается не в восстановлении выполнения скрипта – это скорее всего невозможно в случае программной ошибки, а в отправке сообщения об ошибке разработчикам.
#глобальный_catch #обработка_ошибок
👍6
FormData
Если передать в конструктор элемент HTML-формы
Его особенность заключается в том, что методы для работы с сетью, например
Он будет соответствующим образом закодирован и отправлен с заголовком
То есть, для сервера это выглядит как обычная отправка формы.
P.S. на картинке выше пример отправки данных простой HTML формы с помощью
#formData #сетевые_запросы
FormData
- это объект, представляющий данные HTML формы.Если передать в конструктор элемент HTML-формы
form
, то создаваемый объект автоматически прочитает из неё поля.Его особенность заключается в том, что методы для работы с сетью, например
fetch
, позволяют указать объект FormData
в свойстве тела запроса body
.Он будет соответствующим образом закодирован и отправлен с заголовком
Content-Type: form/multipart
.То есть, для сервера это выглядит как обычная отправка формы.
P.S. на картинке выше пример отправки данных простой HTML формы с помощью
fetch
.#formData #сетевые_запросы
👍3
WebSocket
Протокол
В JavaScript
-
-
-
-
#WebSocket #сетевые_запросы
Протокол
WebSocket
, описанный в спецификации RFC 6455, обеспечивает возможность обмена данными между браузером и сервером через постоянное соединение. Данные передаются по нему в обоих направлениях в виде «пакетов», без разрыва соединения и дополнительных HTTP-запросов.WebSocket
особенно хорош для сервисов, которые нуждаются в постоянном обмене данными, например онлайн игры, торговые площадки, работающие в реальном времени, и т.д.В JavaScript
WebSocket
генерирует 4 события, с помощью которых и строится всё взаимодействие:-
open
– соединение установлено;-
message
– получены данные;-
error
– ошибка;-
close
– соединение закрыто.#WebSocket #сетевые_запросы
👍3
Server Sent Events
Спецификация Server-Sent Events описывает встроенный класс
Как и в случае с
Работа с потоком данных:
- Текст сообщения указывается после
- Сообщения разделяются двойным переносом строки
- Чтобы разделить сообщение на несколько строк, мы можем отправить несколько
Про сравнение SSE с WS.
Протокол SSE одновременно похож на WebSocket, но также сильно отличается. Например, данные отправляются лишь с сервера на клиент и могут иметь только текстовой формат. Однако это не делает
Основное преимущество в простоте использования, что делает
#sse #сетевые_запросы
Спецификация Server-Sent Events описывает встроенный класс
EventSource
, который позволяет поддерживать соединение с сервером и получать от него события.Как и в случае с
WebSocket
, соединение постоянно.Работа с потоком данных:
- Текст сообщения указывается после
data:
, пробел после двоеточия необязателен;- Сообщения разделяются двойным переносом строки
\n\n;
- Чтобы разделить сообщение на несколько строк, мы можем отправить несколько
data:
подряд (третье сообщение).Про сравнение SSE с WS.
Протокол SSE одновременно похож на WebSocket, но также сильно отличается. Например, данные отправляются лишь с сервера на клиент и могут иметь только текстовой формат. Однако это не делает
SSE
ненужным, напротив, у него своя ниша. Основное преимущество в простоте использования, что делает
SSE
более привлекательным для проектов, где вся мощь WS
абсолютно не требуется.#sse #сетевые_запросы
👍2🔥1
Long Polling (длинные опросы)
Длинные опросы – это самый простой способ поддерживать постоянное соединение с сервером, не используя при этом никаких специфических протоколов (типа WebSocket или Server Sent Events).
Его очень легко реализовать, и он хорошо подходит для многих задач.
Как это происходит:
- Запрос отправляется на сервер;
- Сервер не закрывает соединение, пока у него не возникнет сообщение для отсылки;
- Когда появляется сообщение – сервер отвечает на запрос, посылая его;
- Браузер немедленно делает новый запрос.
P.S. на картинке примерный код клиентской функции
#LongPolling #сетевые_запросы
Длинные опросы – это самый простой способ поддерживать постоянное соединение с сервером, не используя при этом никаких специфических протоколов (типа WebSocket или Server Sent Events).
Его очень легко реализовать, и он хорошо подходит для многих задач.
Как это происходит:
- Запрос отправляется на сервер;
- Сервер не закрывает соединение, пока у него не возникнет сообщение для отсылки;
- Когда появляется сообщение – сервер отвечает на запрос, посылая его;
- Браузер немедленно делает новый запрос.
P.S. на картинке примерный код клиентской функции
subscribe,
которая реализует длинные опросы.#LongPolling #сетевые_запросы
👍4🔥1
XMLHttpRequest
Несмотря на наличие слова «XML» в названии, XMLHttpRequest может работать с любыми данными, а не только с XML. Мы можем загружать/скачивать файлы, отслеживать прогресс и многое другое.
Алгоритм работы:
1) Создать
2) Инициализировать его;
3) Послать запрос;
4) Слушать события на
P.S. На сегодняшний день не обязательно использовать
#xhr #сетевые_запросы
XMLHttpRequest
– это встроенный в браузер объект, который даёт возможность делать HTTP-запросы к серверу без перезагрузки страницы.Несмотря на наличие слова «XML» в названии, XMLHttpRequest может работать с любыми данными, а не только с XML. Мы можем загружать/скачивать файлы, отслеживать прогресс и многое другое.
Алгоритм работы:
1) Создать
XMLHttpRequest;
2) Инициализировать его;
3) Послать запрос;
4) Слушать события на
xhr
, чтобы получить ответ.P.S. На сегодняшний день не обязательно использовать
XMLHttpRequest
, так как существует другой, более современный метод fetch.#xhr #сетевые_запросы
👍6🔥2
Опциональная цепочка '?.'
Опциональная цепочка
Опциональная цепочка
P.S. Эта возможность была добавлена в язык недавно. В старых браузерах может понадобиться полифил.
#опциональная_цепочка #основы
Опциональная цепочка
?.
— это безопасный способ доступа к свойствам вложенных объектов, даже если какое-либо из промежуточных свойств не существует.Опциональная цепочка
?.
останавливает вычисление и возвращает undefined
, если часть перед ?.
имеет значение undefined
или null
.P.S. Эта возможность была добавлена в язык недавно. В старых браузерах может понадобиться полифил.
#опциональная_цепочка #основы
👍5🔥3
Копирование объектов
Одним из фундаментальных отличий объектов от примитивных типов данных является то, что они хранятся и копируются «по ссылке».
Примитивные типы: строки, числа, логические значения – присваиваются и копируются «по значению».
Переменная хранит не сам объект, а его «адрес в памяти», другими словами «ссылку» на него.
Чтобы реально скопировать объект, нам нужно создать новый объект и повторить структуру дублируемого объекта, перебирая его свойства и копируя их.
#object #основы
Одним из фундаментальных отличий объектов от примитивных типов данных является то, что они хранятся и копируются «по ссылке».
Примитивные типы: строки, числа, логические значения – присваиваются и копируются «по значению».
Переменная хранит не сам объект, а его «адрес в памяти», другими словами «ссылку» на него.
Чтобы реально скопировать объект, нам нужно создать новый объект и повторить структуру дублируемого объекта, перебирая его свойства и копируя их.
#object #основы
👍7🔥4
Наследование классов
Наследование
Ключевое слово
#наследование #классы
Наследование
extends
пришло в JS с ES6 синтаксисом.Ключевое слово
extends
работает, используя прототипы. Оно устанавливает Rabbit.prototype.[[Prototype]]
в Animal.prototype
. Так что если метод не найден в Rabbit.prototype
, JavaScript берёт его из Animal.prototype
.#наследование #классы
👍8🔥2
Решайте практические тесты из собеседований на нашем втором канале @tests_js
🔥2👍1
Динамические импорты
Инструкции экспорта и импорта, которые мы рассматривали в предыдущем посте, называются «статическими». Синтаксис у них весьма простой и строгий.
Во-первых, мы не можем динамически задавать никакие из параметров
Путь к модулю должен быть строковым примитивом и не может быть вызовом функции. Вот так работать не будет:
Во-вторых, мы не можем делать импорт в зависимости от условий или в процессе выполнения.
Все эти проблемы решает выражение
Выражение import()
Выражение
Использовать его мы можем динамически в любом месте кода, как показано на скрине выше.
#динамический_импорт #модули
Инструкции экспорта и импорта, которые мы рассматривали в предыдущем посте, называются «статическими». Синтаксис у них весьма простой и строгий.
Во-первых, мы не можем динамически задавать никакие из параметров
import
.Путь к модулю должен быть строковым примитивом и не может быть вызовом функции. Вот так работать не будет:
Во-вторых, мы не можем делать импорт в зависимости от условий или в процессе выполнения.
Все эти проблемы решает выражение
import(module)
.Выражение import()
Выражение
import(module)
загружает модуль и возвращает промис, результатом которого становится объект модуля, содержащий все его экспорты.Использовать его мы можем динамически в любом месте кода, как показано на скрине выше.
#динамический_импорт #модули
👍4🔥3
Eval: выполнение строки кода
Встроенная функция
Синтаксис:
Строка кода может быть большой, содержать переводы строк, объявления функций, переменные и т.п.
Результатом
Использование
В современной разработке на JavaScript
Причина такого отношения достаточно проста: давным-давно JavaScript был не очень развитым языком, и многие вещи можно было сделать только с помощью
Встроенная функция
eval
позволяет выполнять строку кода.Синтаксис:
let result = eval(code);
Строка кода может быть большой, содержать переводы строк, объявления функций, переменные и т.п.
Результатом
eval
будет результат выполнения последней инструкции.Использование
В современной разработке на JavaScript
eval
используется весьма редко. Есть даже известное выражение – «eval is evil» («eval – это зло»).Причина такого отношения достаточно проста: давным-давно JavaScript был не очень развитым языком, и многие вещи можно было сделать только с помощью
eval
. Но та эпоха закончилась более десяти лет назад.👍14🔥7
Промисификация
Промисификация – это длинное слово для простого преобразования. Мы берём функцию, которая принимает колбэк и меняем её, чтобы она вместо этого возвращала промис.
Такие преобразования часто необходимы в реальной жизни, так как многие функции и библиотеки основаны на колбэках, а использование промисов более удобно, поэтому есть смысл «промисифицировать» их.
Например, у нас есть
Давайте промисифицируем её. Новая функция
#promise #продвинутый
Промисификация – это длинное слово для простого преобразования. Мы берём функцию, которая принимает колбэк и меняем её, чтобы она вместо этого возвращала промис.
Такие преобразования часто необходимы в реальной жизни, так как многие функции и библиотеки основаны на колбэках, а использование промисов более удобно, поэтому есть смысл «промисифицировать» их.
Например, у нас есть
loadScript(src, callback)
(см. левую часть картинки)Давайте промисифицируем её. Новая функция
loadScriptPromise(src)
будет делать то же самое, но будет принимать только src
(не callback
) и возвращать промис (см. правую часть картинки)#promise #продвинутый
👍17❤4🔥4
Callbacks (Колбэки)
Колбэк функция - это такая функция, которая вызывается после выполнения какой-то асинхронности.
В данном примере описана функция динамической подгрузки скриптов с колбеком, после загрузки. Функция
Колбэки используются повсеместно, не только в JavaScript.
#callback #колбэк #продвинутый
Колбэк функция - это такая функция, которая вызывается после выполнения какой-то асинхронности.
В данном примере описана функция динамической подгрузки скриптов с колбеком, после загрузки. Функция
callback
выполнится, когда скрипт будет полностью загружен на странице.Колбэки используются повсеместно, не только в JavaScript.
#callback #колбэк #продвинутый
👍30❤2
Микрозадачи
Асинхронные задачи требуют правильного управления. Для этого стандарт предусматривает внутреннюю очередь
Как сказано в спецификации:
- Очередь определяется как первым-пришёл-первым-ушёл (FIFO): задачи, попавшие в очередь первыми, выполняются тоже первыми.
- Выполнение задачи происходит только в том случае, если ничего больше не запущено.
Или, проще говоря, когда промис выполнен, его обработчики
Вот почему сообщение «код выполнен» в примере выше будет показано первым.
#микрозадачи #промисы
Асинхронные задачи требуют правильного управления. Для этого стандарт предусматривает внутреннюю очередь
PromiseJobs
, более известную как «очередь микрозадач (microtask queue)» (термин V8).Как сказано в спецификации:
- Очередь определяется как первым-пришёл-первым-ушёл (FIFO): задачи, попавшие в очередь первыми, выполняются тоже первыми.
- Выполнение задачи происходит только в том случае, если ничего больше не запущено.
Или, проще говоря, когда промис выполнен, его обработчики
.then/catch/finally
попадают в очередь. Они пока не выполняются. Движок JavaScript берёт задачу из очереди и выполняет её, когда он освободится от выполнения текущего кода.Вот почему сообщение «код выполнен» в примере выше будет показано первым.
#микрозадачи #промисы
👍20❤4
Цепочка промисов
Идея состоит в том, что результат первого промиса передаётся по цепочке обработчиков
Поток выполнения такой:
- Начальный промис успешно выполняется через 1 секунду
- Затем вызывается обработчик в
- Возвращаемое им значение передаётся дальше в следующий обработчик
- …и так далее.
В итоге результат передаётся по цепочке обработчиков, и мы видим несколько alert подряд, которые выводят:
#промисы #цепочка_промисов
Идея состоит в том, что результат первого промиса передаётся по цепочке обработчиков
.then
.Поток выполнения такой:
- Начальный промис успешно выполняется через 1 секунду
(*)
,- Затем вызывается обработчик в
.then
(**)
.- Возвращаемое им значение передаётся дальше в следующий обработчик
.then
(***)
- …и так далее.
В итоге результат передаётся по цепочке обработчиков, и мы видим несколько alert подряд, которые выводят:
1
→ 2
→ 4
.#промисы #цепочка_промисов
👍11🔥3
Асинхронные итераторы
Асинхронные итераторы похожи на обычные итераторы, но имеют некоторые синтаксические отличия.
Чтобы сделать объект итерируемым асинхронно:
1. Используется
2.
3. Чтобы перебрать такой объект, используется цикл
На картинке выше вы можете увидеть итерируемый объект
#генераторы #асинхронные_итераторы
Асинхронные итераторы похожи на обычные итераторы, но имеют некоторые синтаксические отличия.
Чтобы сделать объект итерируемым асинхронно:
1. Используется
Symbol.asyncIterator
вместо Symbol.iterator
2.
next()
должен возвращать промис.3. Чтобы перебрать такой объект, используется цикл
for await (let item of iterable)
.На картинке выше вы можете увидеть итерируемый объект
range
.#генераторы #асинхронные_итераторы
👍12🔥2