🙏🏻 Promise. Часть 1
Решила освежить в памяти и разобрать нюансы с "обещаниями" в JavaScript. В первой части обозревательно познакомимся со страшным зверем по имени Promise и разберемся, зачем он в принципе нужен.
Дисклеймер: каждый уважающий себя фронтендер должен знать, как работает промис.
Что это?
Promise - это объект. Согласно документации он предназначен для работы с результатами отложенных (в основном, асинхронных) вычислений. Он предоставляет огромные возможности, главным образом - для работы с сетью.
Как это работает?
У Promise есть состояния. И их три:
- fulfilled. Состояние "выполнено успешно" и получен результат выполнения.
- rejected. Состояние "выполнено с ошибкой" и получена ошибка.
- pending. Состояние "ожидания", т.е. вычисление/операция выполняется прямо сейчас и мы ждем результат.
При работе с промисами мы ориентируемся на эти состояния.
При организации работы с промисами мы используем функции-коллбеки, т.е. "когда промис будет в состоянии X, вызови функцию Y". Коллбеки вешаются через методы промиса then, catch и finally. Но разберемся мы с ними позже 😉
Как создать промис?
Т.к. промис это объект, то его можно просто создать с помощью конструктора. В конструктор надо передать функцию-исполнитель (executor), которая выполняется сразу же и принимает в себя два коллбека - на успех и на ошибку. Выглядит это так:
❗ Еще до создания инстанса функция-исполнитель выполняется, т.е. моментально. Это важно помнить. Поэтому обычно создание промиса оборачивают в функцию, которую можно управляемо вызвать.
В следующих частях мы разберем методы промиса, вникнем в нюансы их использования, а также посмотрим альтернативные способы асинхронной работы. Всем рабочего веба! 🐥
#basics
Решила освежить в памяти и разобрать нюансы с "обещаниями" в JavaScript. В первой части обозревательно познакомимся со страшным зверем по имени Promise и разберемся, зачем он в принципе нужен.
Дисклеймер: каждый уважающий себя фронтендер должен знать, как работает промис.
Что это?
Promise - это объект. Согласно документации он предназначен для работы с результатами отложенных (в основном, асинхронных) вычислений. Он предоставляет огромные возможности, главным образом - для работы с сетью.
Как это работает?
У Promise есть состояния. И их три:
- fulfilled. Состояние "выполнено успешно" и получен результат выполнения.
- rejected. Состояние "выполнено с ошибкой" и получена ошибка.
- pending. Состояние "ожидания", т.е. вычисление/операция выполняется прямо сейчас и мы ждем результат.
При работе с промисами мы ориентируемся на эти состояния.
При организации работы с промисами мы используем функции-коллбеки, т.е. "когда промис будет в состоянии X, вызови функцию Y". Коллбеки вешаются через методы промиса then, catch и finally. Но разберемся мы с ними позже 😉
Как создать промис?
Т.к. промис это объект, то его можно просто создать с помощью конструктора. В конструктор надо передать функцию-исполнитель (executor), которая выполняется сразу же и принимает в себя два коллбека - на успех и на ошибку. Выглядит это так:
const myPromise = new Promise((resolve, reject) => {
// здесь выполняется
// асинхронная операция.
// по результату вызовется
// одна из функций:
// при успехе
// resolve(result);
// при ошибке
// reject('Smth wrong');
});
❗ Еще до создания инстанса функция-исполнитель выполняется, т.е. моментально. Это важно помнить. Поэтому обычно создание промиса оборачивают в функцию, которую можно управляемо вызвать.
В следующих частях мы разберем методы промиса, вникнем в нюансы их использования, а также посмотрим альтернативные способы асинхронной работы. Всем рабочего веба! 🐥
#basics
Какое состояние у промиса, когда мы ещё не знаем результата выполнения вычислений?
Anonymous Quiz
0%
rejected
92%
pending
0%
fulfilled
8%
нет верного ответа, т.к. функция-исполнитель вызывается сразу и мы сразу знаем результат
🙏🏻 Promise. Часть 2
В прошлой части мы познакомились (или вспомнили), что такое Promise и зачем он нужен. Пришло время понять, как его использовать в продукшене. А делается это с помощью обработчиков.
Обработчик успеха
Функция-обработчик в случае успеха может быть передана в метод .then. В себя эта функция принимает данные, с которыми Promise выполнился ("зарезолвился"). Пример:
Обработчик ошибки
Функция-обработчик ошибки может быть передан двумя способами.
1 - через метод .then вторым аргументом. Формат работы такой же, как и в предыдущем случае. Пример:
2 - через специальный метод .catch. Работает аналогично предыдущему пункту.
⚠️ Важно помнить: ошибки Promise - это исключения. То есть с каким-то логически ошибочными историями Promise не справится самостоятельно. Например, если запрос упадет с кодом ответа, отличным от 200, catch не поймает эту ошибку, т.к. это штатное поведение, а не исключение.
⚠️ ⚠️ При оффлайн запросах Promise сразу падает в catch. Важно помнить это, например, при настройке оффлайн взаимодействия
Про другие интересные случаи ошибочного использования промисов можно прочитать здесь.
Финальная обработка
Если нам нужно, чтобы какая-то обработка была выполнена в любом случае, как бы Promise не выполнился, то можно использовать метод .finally. Формат такой же - передаем функцию, но она не принимает в себя данные.
Можно использовать finally до основных обработчиков then/catch. Например, для организации индикаторов загрузки. Finally пропустит все данные (результат или ошибку) дальше к следующим обработчикам.
Вот и всё про стандартное использование обработчиков Promise. В следующих частях мы посмотрим на цепочки промисов, а также разберем альтернативные способы асинхронной работы. Бегом делать веб! 🏃🏻♀️
#basics
В прошлой части мы познакомились (или вспомнили), что такое Promise и зачем он нужен. Пришло время понять, как его использовать в продукшене. А делается это с помощью обработчиков.
Обработчик успеха
Функция-обработчик в случае успеха может быть передана в метод .then. В себя эта функция принимает данные, с которыми Promise выполнился ("зарезолвился"). Пример:
const myPromise = new Promise((resolve, reject) => {
const name = 'Liza';
resolve(name);
});
// выведется "Hi, Liza!"
myPromise.then((data) =>
console.log(`Hi, ${data}`));
Обработчик ошибки
Функция-обработчик ошибки может быть передан двумя способами.
1 - через метод .then вторым аргументом. Формат работы такой же, как и в предыдущем случае. Пример:
const myPromise = new Promise((resolve, reject) => {
reject('custom error');
});
const onSuccess = (data) =>
console.log(`Hi, ${data}`);
const onError = (error) =>
console.error(
`Error: ${error}`
);
// выведется
// "Error: custom error"
myPromise.then(
onSuccess,
onError
);
2 - через специальный метод .catch. Работает аналогично предыдущему пункту.
⚠️ Важно помнить: ошибки Promise - это исключения. То есть с каким-то логически ошибочными историями Promise не справится самостоятельно. Например, если запрос упадет с кодом ответа, отличным от 200, catch не поймает эту ошибку, т.к. это штатное поведение, а не исключение.
⚠️ ⚠️ При оффлайн запросах Promise сразу падает в catch. Важно помнить это, например, при настройке оффлайн взаимодействия
Про другие интересные случаи ошибочного использования промисов можно прочитать здесь.
Финальная обработка
Если нам нужно, чтобы какая-то обработка была выполнена в любом случае, как бы Promise не выполнился, то можно использовать метод .finally. Формат такой же - передаем функцию, но она не принимает в себя данные.
Можно использовать finally до основных обработчиков then/catch. Например, для организации индикаторов загрузки. Finally пропустит все данные (результат или ошибку) дальше к следующим обработчикам.
Вот и всё про стандартное использование обработчиков Promise. В следующих частях мы посмотрим на цепочки промисов, а также разберем альтернативные способы асинхронной работы. Бегом делать веб! 🏃🏻♀️
#basics
Какой обработчик промиса лучше использовать, если нужно убрать лоадер после получения ответа с сервера?
Anonymous Quiz
0%
мы не можем точно отследить, когда пришел ответ, т.к. промис асинхронный
11%
then
11%
catch
78%
finally
0%
нужно придумывать свои костыли
⚡ Notion Meetup
Давно я не звала вас на митапы 🤓 Пора исправлять!
Сегодня в копилке предложений не совсем фронтовая тема, но как мне кажется - очень любопытная. В конце июня команда популярного инструмента для ведения заметок Notion проводит первый саммит. В программе выступления разных членов команды. Из прикольного ребята покажут (по крайней мере обещают), как они сами используют ноушен, что в нем вкусного появилось, как внедрить этот «заметочник» в жизнь своей команды для повышения продуктивности.
В общем для меня звучит вкусно, особенно в свете появления публичного Notion API. Кому тоже любопытно, ссылку прикрепляю.
⚠️ online
⚠️⚠️ english
#meetup #noJS
Давно я не звала вас на митапы 🤓 Пора исправлять!
Сегодня в копилке предложений не совсем фронтовая тема, но как мне кажется - очень любопытная. В конце июня команда популярного инструмента для ведения заметок Notion проводит первый саммит. В программе выступления разных членов команды. Из прикольного ребята покажут (по крайней мере обещают), как они сами используют ноушен, что в нем вкусного появилось, как внедрить этот «заметочник» в жизнь своей команды для повышения продуктивности.
В общем для меня звучит вкусно, особенно в свете появления публичного Notion API. Кому тоже любопытно, ссылку прикрепляю.
⚠️ online
⚠️⚠️ english
#meetup #noJS
В одном из предыдущих постов упоминала про обработку ответов Promise, что он не ловит коды ответов, отличных от 200. Тру стори в том, что только что я сама потратила минут 15 в тупую в попытке поймать 401 с помощью try… catch. No comments 🤦♀️
#meh
#meh
🐥Dev Week от Mail.Ru Group
Всем привет, ребяты)
Давно хотела поделиться еще одним вкусным митапом, но как-то организаторы тянули с рассмотрением заявки 🥺
Итак, с 15 по 18 июня разработчики из Mail.ru Group проводят серию митапов (C++, Python, Frontend и QA).
17 июня в 19-00 будет секция фронтенда, где можно послушать про дизайн-систему на фронтенде, распознавание лиц, оффлайн-режим и кое-что еще, о чем пока умалчивается. Из интересного эта же встреча считается митапом MoscowJS 49, так что определенно уровень будет огненный 🔥
А теперь о грустном - митапы пройдут онлайн 😢 Был анонс, что часть гостей можно будет принять оффлайн в офисе Mail.ru, но последние ограничения внесли коррективы. Поэтому категорически грустим и ждем лучшей эпидемиологической обстановки.
Энивей, всех приглашаю на эти любопытные встречи, должно быть интересно. Ссылку на регистрацию оставляю. Совет заинтересованным немного ускориться 🙃
Всем рабочего веба 🤓
P.S. я еще и на QA пойду. Первый "выход в свет" как профессиональный тестировщик 😎
#meetup #noJS
Всем привет, ребяты)
Давно хотела поделиться еще одним вкусным митапом, но как-то организаторы тянули с рассмотрением заявки 🥺
Итак, с 15 по 18 июня разработчики из Mail.ru Group проводят серию митапов (C++, Python, Frontend и QA).
17 июня в 19-00 будет секция фронтенда, где можно послушать про дизайн-систему на фронтенде, распознавание лиц, оффлайн-режим и кое-что еще, о чем пока умалчивается. Из интересного эта же встреча считается митапом MoscowJS 49, так что определенно уровень будет огненный 🔥
А теперь о грустном - митапы пройдут онлайн 😢 Был анонс, что часть гостей можно будет принять оффлайн в офисе Mail.ru, но последние ограничения внесли коррективы. Поэтому категорически грустим и ждем лучшей эпидемиологической обстановки.
Энивей, всех приглашаю на эти любопытные встречи, должно быть интересно. Ссылку на регистрацию оставляю. Совет заинтересованным немного ускориться 🙃
Всем рабочего веба 🤓
P.S. я еще и на QA пойду. Первый "выход в свет" как профессиональный тестировщик 😎
#meetup #noJS
devweek.ru
Dev Week Mail.ru Group, Серия открытых митапов для разработчиков любого уровня
🖥 Доступность интерфейса
Есть много способов сверстать одну и ту же деталь интерфейса, согласны? Люди об этом даже статьи пишут, показывают свои наноультрамодные способы сделать кнопку из дивака. А зачем?
Вот придумали ребята ещё в лохматом HTML3 тег <button>, думали, все им пользоваться будут. Ха!
К чему я это всё. Стандартные браузерные решения (button, form etc.) могут сильно помочь в UX, потому что они из коробки поддерживают доступность с клавиатуры. А значит, пользователи смогут с большей вероятностью осуществить целевое действие.
Нет, вы конечно можете играться с tabIndex и ставить швабры для удержания потолка. Если у вас есть время и вы можете аргументировать, почему так лучше 😉
Мораль (и совет при выполнении тестовых заданий): используйте браузерные решения, чтобы облегчить себе и клиентам жизнь.
Всем чистой консоли ✌️
#advanced
Есть много способов сверстать одну и ту же деталь интерфейса, согласны? Люди об этом даже статьи пишут, показывают свои наноультрамодные способы сделать кнопку из дивака. А зачем?
Вот придумали ребята ещё в лохматом HTML3 тег <button>, думали, все им пользоваться будут. Ха!
К чему я это всё. Стандартные браузерные решения (button, form etc.) могут сильно помочь в UX, потому что они из коробки поддерживают доступность с клавиатуры. А значит, пользователи смогут с большей вероятностью осуществить целевое действие.
Нет, вы конечно можете играться с tabIndex и ставить швабры для удержания потолка. Если у вас есть время и вы можете аргументировать, почему так лучше 😉
Мораль (и совет при выполнении тестовых заданий): используйте браузерные решения, чтобы облегчить себе и клиентам жизнь.
Всем чистой консоли ✌️
#advanced
☝🏻если что, мысль выше взята не с потолка: ребята из команды мессенджера ВКонтакте активно прувят эту идею 🤓
А к какому лагерю относишься ты?
Anonymous Poll
63%
😍 стандартные теги - моя любофф
13%
😎 мои костыли - лучшие!
25%
😋 по настроению
0%
😑 все равно
🤯 Какой браузер мне нужен?
Mac OS + Google Chrome = 🤓
Так начинают работать многие новички, когда приходят на фронтенд-стажировку. И по правде сказать, мне потребовалось два года, чтобы переехать на … Хотя об этом позже.
Чем хорош хром?
☑️ Поддержка современного JS
☑️ Удобные developer tools
☑️ Куча гайдов (в тч на learnjs)
☑️ Не сильные breaking changes между версиями
☑️ Довольно большое количество активных пользователей
☑️ Расширения
Что плохо?
❌ Не все пользуются им 🤗
❌ Мобильная версия иногда сильно отличается
❌ На iPhone он такой же Safari, нужно искать андроид
❌ Постоянно обновляющиеся настройки, особенно приватности (привет, CORS 🙋♀️)
❌ Следит за нами и сливает инфо Треккинг
Что по альтернативам?
Я сейчас переехала на Firefox. Ребят, лиса реально очень симпатичная. Инструменты разработчика a-ka Google. Побезопаснее (говорят). Из коробки удобно работать с кросс-доменными куками (не спрашивайте, локальная разработка без этого болит). Правда в симуляторе надо каждый раз обновлять страницу в ручную. Но зато цветопередача просто вишенка 🍒
Safari тоже классный, но как-то и багов много в консоли, и функции многие надо полифилить, да и инструменты там довольно сложные.
В Яндексе, к слову, разрабы должны работать только в Я.Браузере. Тоже довольно приятный инструмент. Он почти как хром. Но почти, помните об этом.
Вообще советую всё-таки регулярно выходить из зоны комфорта и по умолчанию использовать другой браузер. Чтобы не замыливалось. Я, например, сейчас все личные вопросы решаю через Safari. На Big Sur он просто космос 🚀
Все субъективно. Решать вам. Всем браузеров без багов 🤟🏻
#meh
Mac OS + Google Chrome = 🤓
Так начинают работать многие новички, когда приходят на фронтенд-стажировку. И по правде сказать, мне потребовалось два года, чтобы переехать на … Хотя об этом позже.
Чем хорош хром?
☑️ Поддержка современного JS
☑️ Удобные developer tools
☑️ Куча гайдов (в тч на learnjs)
☑️ Не сильные breaking changes между версиями
☑️ Довольно большое количество активных пользователей
☑️ Расширения
Что плохо?
❌ Не все пользуются им 🤗
❌ Мобильная версия иногда сильно отличается
❌ На iPhone он такой же Safari, нужно искать андроид
❌ Постоянно обновляющиеся настройки, особенно приватности (привет, CORS 🙋♀️)
❌ Следит за нами и сливает инфо Треккинг
Что по альтернативам?
Я сейчас переехала на Firefox. Ребят, лиса реально очень симпатичная. Инструменты разработчика a-ka Google. Побезопаснее (говорят). Из коробки удобно работать с кросс-доменными куками (не спрашивайте, локальная разработка без этого болит). Правда в симуляторе надо каждый раз обновлять страницу в ручную. Но зато цветопередача просто вишенка 🍒
Safari тоже классный, но как-то и багов много в консоли, и функции многие надо полифилить, да и инструменты там довольно сложные.
В Яндексе, к слову, разрабы должны работать только в Я.Браузере. Тоже довольно приятный инструмент. Он почти как хром. Но почти, помните об этом.
Вообще советую всё-таки регулярно выходить из зоны комфорта и по умолчанию использовать другой браузер. Чтобы не замыливалось. Я, например, сейчас все личные вопросы решаю через Safari. На Big Sur он просто космос 🚀
Все субъективно. Решать вам. Всем браузеров без багов 🤟🏻
#meh
✌️Про браузеры. Продолжение
На примере хотела показать отличие лисы от хрома. Я думала, это мелочь, но капец как оказалось важно.
Логирование переменной, в которой пустая строка.
Хром печатает примерно ничего. Не разберешь, он что-то напечатал или нет.
Лиса показывает, что строка пустая.
Фича? Фича! Классно? Классно! 😇
Выбирайте удобный браузер 😎 Всем хорошего дня 🙂
#meh
На примере хотела показать отличие лисы от хрома. Я думала, это мелочь, но капец как оказалось важно.
Логирование переменной, в которой пустая строка.
Хром печатает примерно ничего. Не разберешь, он что-то напечатал или нет.
Лиса показывает, что строка пустая.
Фича? Фича! Классно? Классно! 😇
Выбирайте удобный браузер 😎 Всем хорошего дня 🙂
#meh
🥨 Конкатенация строк. Ускоряем фронтенд
Как бы решали задачу: "Объедините строки А и Б в одну строку"? Казалось бы, задача не самая сложная. Но есть "но"... 🙊
Мы знаем как минимум четыре способа соединить строки:
1. Шаблонные строки (моя любофф). Удобно, быстро, без экранирования кавычек, всё предельно понятно. Разве что бэктик на клавиатуре искать долго 😃. Пример:
2. Join. Метод пришел от массивов и работает аналогично. Из приятного - можно указать разделитель и объединить строки, например, через запятую. Но можно и просто склеить без проблем. Пример:
3. Concat. По смыслу наиболее подходящий для нашей задачи способ. Из прикольного, можно объединять строку с массивом, и все автоматически преобразуется к строке. из не прикольного - нужна какая-то начальная строка, чтобы у нее вызывать этот метод. Пример:
4. Оператор сложения (+). Наиболее прикольный в JS способ, как мне кажется. По сути "склеивает" две строки. И не только строки 😁 Пример:
Вспомнили? А знаете, какой из способов самый быстрый?
#basics
Как бы решали задачу: "Объедините строки А и Б в одну строку"? Казалось бы, задача не самая сложная. Но есть "но"... 🙊
Мы знаем как минимум четыре способа соединить строки:
1. Шаблонные строки (моя любофф). Удобно, быстро, без экранирования кавычек, всё предельно понятно. Разве что бэктик на клавиатуре искать долго 😃. Пример:
${a}{b};
2. Join. Метод пришел от массивов и работает аналогично. Из приятного - можно указать разделитель и объединить строки, например, через запятую. Но можно и просто склеить без проблем. Пример:
[‘hello', ' world'].join()
;3. Concat. По смыслу наиболее подходящий для нашей задачи способ. Из прикольного, можно объединять строку с массивом, и все автоматически преобразуется к строке. из не прикольного - нужна какая-то начальная строка, чтобы у нее вызывать этот метод. Пример:
a.concat(b)
;4. Оператор сложения (+). Наиболее прикольный в JS способ, как мне кажется. По сути "склеивает" две строки. И не только строки 😁 Пример:
а + b
Вспомнили? А знаете, какой из способов самый быстрый?
#basics
👆К чему я это все. Про оптимизацию фронтенда.
Я провела небольшой ручной тест в консоли браузера и была в шоке 🤯
Вы молодцы, что угадали. Обычный плюс - это самая быстрая склейка строк. Хоть и самая опасная. Зато примитивная 😋
Так что в случае острой необходимости оптимизаций вы теперь знаете, куда смотреть.
Всем шустрого веба 🔥
Я провела небольшой ручной тест в консоли браузера и была в шоке 🤯
Вы молодцы, что угадали. Обычный плюс - это самая быстрая склейка строк. Хоть и самая опасная. Зато примитивная 😋
Так что в случае острой необходимости оптимизаций вы теперь знаете, куда смотреть.
Всем шустрого веба 🔥
👀 Вы когда-нибудь задумывались, что ваши глаза могут вас обманывать?
А это может действительно искажать восприятие у пользователей. Но прежде, чем я расскажу, к чему это все, давайте проведём тест. Посмотрите внимательно на картинки выше ☝🏻
#meh
А это может действительно искажать восприятие у пользователей. Но прежде, чем я расскажу, к чему это все, давайте проведём тест. Посмотрите внимательно на картинки выше ☝🏻
#meh