Прошел курс за 42 помодорки (17,5 часов). В прохождение входило: просмотр видеокурса, выполнение примеров из курса и конспектирование.
Пройдены все темы, но начиная с темы "Промисы" начались сложности, так как до этого данные темы не проходил.
Основная цель прохождения курса - повторение уже изученного материала.
Цель написания конспекта - упражнение для более быстрого включения в учебный процесс b практика работы с разметкой Markdown.
Надеюсь, конспект пригодится мне в случае перепрохождения видеокурса или кому-либо, если понадобится текстовый вариант курса.
- выражения
- функции
- объекты
consol.log('Войти в IT к 30');
- console - объект;
- log (dir, table и тд) - метод (функция значение одного из свойств объекта);
- . - точечная запись (получение доступа к свойствам объекта);
- () - вызов метода;
- 'Войти в IT к 30' - аргумент;
Всегда возвращает значение (результат выражения)
Выражение присваивания =
a = 10;
Выражения с побочными действиями - не только возвращает значения, но и выполняет другие действия.
a = 5;
- вернет значение и присвоит значение переменной;
b++;
- вернет значение и увеличит значение на 1;
myFunction(c, d);
- внутри функции происходят побочные действия, помимо возврата значения.
Дают возможность повторного доступа к значения
коробка в которую можно что-то поместить, дать этой коробке имя и в дальнейшем обратиться к значению, распаковать, поменять содержимое, выполнить какое-то действие
НАЗВАНИЕ ПЕРЕМЕННЫХ ДОЛЖНО БЫТЬ ПОНЯТНО!
-
PascalCase - именование переменной начинается с заглавной буквы как и последующие слова (без пробелов). Используются для именования типов и классов в JS;
-
SCREAMING_SNAKE_CASE - все символы заглавные, вместо пробела используется _ . Применяется для именования переменной, значение которой известны до запуска приложения и не меняются (const);
-
сamelCase - каждое слово в переменной пишется с заглавной буквы, кроме первого. Используется во всех остальных случаях, помимо вышеуказанных.
let a
ключевое слово и имя переменной
С помощью ключевого слова даем инструкицю интерпретатору JS создать переменную.
const c = 10;
Объявление переменной и присваивание значения.
a = true;
Присваивание (переназначение).
-
let - можно переназначить, переприсвоить. Можно не присваивать значение, в таком случае значение будет undefined;
-
const - нельзя переназначить. Обязательно сразу присвоить значение.
-
var - ключевое слово до ES6
-
- string (строка)
- number (число)
- boolean (логический)
- undefined
- null
- symbol (символ)
-
- object (объект)
Переменная содержит ссылку на область в мамяти где находится объект
JS - динамически типизируемый язык. Тип переменной не указывается, когда она объявляется.
Правила работы с переменными:
- Все переменные объявлять перед их использованием
- Стараться использовать const везде, где это возможно
Объект - набор свойств - ключ: значение.
Порядок св-в не имеет значения.
Метод - св-во объекта, которое является функцией.
- Точечная запись (Dot notation)
obj.new-property = true;
- Скобочная запись (Bracket notation)
obj['new-property'] = true;
Новое св-во обязательно в кавычках ' ', в виде строки.
Такой синтаксис применим, если необходимо задать ключ свойства объекта, значением переменной.
let nameVariable = 'new-property';
obj[nameVariable] = true;
В итоге, в объекте появится свойство:
new-property: true,
delete obj.new-property // при помощи оператора delete
const myCity = {
city: 'New York',
info: {
isPopular: true,
country: 'USA',
},
street: 'Lenina',
};
Чтобы получить значение свойства с ключом isPopular
console.log(myCity.info.isPopular);
Можно комбенировать записи:
delete myCity.info['isPopular'];
Такую запись лучше использовать когда в [ ] какое-то выражение, например название переменной
Когда используются переменные в формировании объекта и название переменной совпадает с названием ключа свойства объекта, то
const name = 'Bogdan';
const postsQty =23;
const userProfile = {
name: name,
postsQty: postsQty,
hasSignedAgreement: false,
};
Сокращенный вариант
const userProfile = {
name,
postsQty,
hasSignedAgreement: false,
};
Сокращенные свойства рекомендуется размещать в начале объекта
window - веб браузеры
global - Node.js
globalThis - унифицированный глобальный объекта
consol
window.consol
global.console
Метод - свойство объекта, значение которого - функция
const myCity = {
city: 'New York',
cityGreeting: function () {
console.log('Greetings!!!');
}
};
myCity.cityGreeting(); // вызов метода cityGreeting
const myCity = {
city: 'New York',
cityGreeting() {
console.log('Greetings!!!');
}
};
myCity.cityGreeting();
Если значение свойства функция - можно убирать ключевое слово function и ставить круглые скопки после названия свойства, без двоеточия
Метод вызывается со скобками, свойство - без.
myCity.cityGreeting();
- метод
myCity.cityGreeting;
- свойство
Формат обмена данными
Набор свойства в двойных кавфчках, разных типов. Передаётся в виде строки.
Конвертация JSON в JS объект (распарсить)
JSON.parse(аргумент)
Конвертация JS объекта в JSON
JSON.stringify(аргумент)
Копирование примитивных типов происходит по значению (copy by value)
Копирование ссылочного типа (copy by reference) - меняется исходный объект
- Метод assign (не работает на вложенные объекты)
const person = {
name: 'Bob',
age: 25,
};
const person2 = Object.assign({}, person);
person2.favoriteСolor = 'black';
- Spread syntax - оператор разделения объекта на свойства (не работает на вложенные объекты)
const person = {
name: 'Bob',
age: 25,
};
const person2 = {...person};
person2.favoriteСolor = 'black';
- JSON.parse - JSON.stringify
const person = {
name: 'Bob',
age: 25,
favoriteСolor: {
oneColor: 'black',
twoColor: 'green',},
};
const person2 = JSON.parse(JSON.stringify(person));
person2.favoriteСolor.oneColor = 'blue';
Блок кода, который можно выполнять многократно
- именованной;
- анонимной;
- присвоенна переменной;
- аргументом при вызове другой функции;
- значение свойства объекта (методом)
function myFN(a, b) {
return a + b;
}
console.log(sum(3, 11));
function
- ключевое слово
myFN
- имя функции
(a, b)
- параметры, ведут себя как переменные. Значения определяются в момент вызова функции.
{...}
- тело функции
return
- возвращение результата. После инструкции с ключевым словом return - функция прекращает выполнение дальнейших инструкций. Если нет return, то возвращает undefined
sum(3, 11)
- вызов функции с аргументами
Функция вызывается внутри другой функции
function anotherFunction() {
console.log('Hola');
}
function fnWithCallback(callbackFunction) {
callbackFunction();
}
fnWithCallback(anotherFunction);
- Называйте функции исходя из выполняемых задач
- Одна задача- одна функция (single properts)
- Не рекомендуется изменять внешние относительно функции переменные (pure function)
Определяет границы действия переменной
- Глобальные переменные (window, global, новые переменные)
- Локальные переменные
- Глобальная область видимости
- Область видимости функции
- Область видимости блока (любой код между { } )
Инструкция интерпретатору JS аналезировать код более пристально
'use strict'
- строка должна быть первой в глобальной области видимости или в области видимости функции
Встроенная функция
Основные операторы:
- Арифметические
+ - * /
- Сравнения
=== !== <= >=
- Логические
! && ||
- Присваивания
=
Текстовые операторы:
typeof
instanceof
new
delete
Еще операторы:
,
- можно объявить несколько переменных
Операнд (аргументы) - то, что находится вокург операторов
Унарный оператор - всегда один операнд
a++
+a
typeof a
delete obj.a
}
Бинарный оператор - два операнда
a = 5;
a + b;
a += b;
Оператор находится между операндами
a = true;
a + b;
a > b;
Оператор стоит перед операндом
++a;
typeof a;
Оператор стоит после операндами
a++
myFunction()
()
- тоже оператор
Можно понять логически или восспользоваться таблицой приоритетности
!
- не (всегда позвращает значение типа Boolean)
&&
- и (возвращает значение одного из операндов)
||
- или (возвращает значение одного из операндов)
Значения, которые при приведении к логическому типу дают false
Boolean(value) -> false
false
0
''
undefined
null
Все остальное - истынные значения
унарный, префиксный, текстовый оператор
Значение всегда строка, которая показывает тип
Две формы записи:
typeof(10)
typeof 10
Чаще всего используется в условных инструкциях
!10 // false
!0 // true
!'abc' // false
!undefined // true
Можно легко конвектировать любое значение в булевое
!!10 // true
!0 // false
!'abc' // true
!undefined // false
Являются операторами короткого замыкания (short circuit)
Выражение 1 && Выражение 2
Выражение возвращает значение.
Если Выражение 1 ложо, то Выражение 2 игнорируется. И возвращается результат Выражения 1 как как результат всего выражения Выражение 1 && Выражение 2
(возвращает перое ложно, либо последний операнд)
Выражение 1 || Выражение 2
Если Выражение 1 истина то Выражение 2 игнорируется. И возвращается результат Выражения 1 как как результат всего выражения Выражение 1 || Выражение 2
(возвращает перое истина, либо последний операнд)
const button = {
width: 200,
text: 'Buy',
};
const redButton = {
...button, // скопировали объект
color: 'red', // добавили свойство
};
const buttonInfo = {
text: 'Buy',
};
const buttonStyle = {
color: 'yellow',
width: 200,
height: 300,
};
const button = {
...buttonInfo,
...buttonStyle
};
console.log(button);
Оператор + для соединения строк
'Hello ' + 'World'
const hello = 'Hello';
const world = 'World';
const greeting = hello + ' ' + world;
const hello = 'Hello';
const world = 'World';
const greeting = `${hello} ${world}`;
Разница между объявленной функцией и функциональным выражением
Объявленная функция
function myFn(a, b) {
let c;
a = a = 1;
c = a + b;
return c;
}
Функциональное выражение
function(a, b) {
let c;
a = a = 1;
c = a + b;
return c;
}
Функциональные выражения всегда анонимные
Присвоение функционального выражения переменной
const myFunction = function(a, b) {
let c;
a = a = 1;
c = a + b;
return c;
};
myFunction(5, 3);
Всегда анонимные
(a, b) => {
let c;
a = a = 1;
c = a + b;
return c;
}
Присвоение стрелочной функции
const myFunction = (a, b) => {
let c;
a = a = 1;
c = a + b;
return c;
};
- Если один параметр, то круглые скобки можно опустить
a => { // тело функции }
- Если тело функции состоит из одного выражения, то фигурные скобки можно опустить
(a, b) => a + b
(неявно возвращает результат, без return)
function multByFactor(value, multiplier = 1) {
return value * multiplier;
}
console.log(multByFactor(10, 2));
console.log(multByFactor(5));
Неявный возврат
const newPost = (post, addedDt = Date()) => ({
...post,
addedDt,
});
const firstPost = {
id: 777,
autor: 'Vlad',
};
console.log(newPost(firstPost));
Возврат при помощи return
const newPost = (post, addedDt = Date()) => {
return {
...post,
addedDt,
};
};
const firstPost = {
id: 777,
autor: 'Vlad',
};
console.log(newPost(firstPost));
const fnWithError = () => {
throw new Error('Some error');
};
fnWithError();
console.log('Continue...');
// log не отобразится из-за ошибки
try {
// выполнение блока кода
} catch (error) {
// этот блок выполняется в случае возникновения ошибок в блоке try
}
const fnWithError = () => {
throw new Error('Some error');
};
try {
fnWithError();
} catch (error) {
console.error(error);
console.log(error.massage);
}
console.log('Continue...');
Выражение всегда возвращает значение
Инструкция выполняет определенные действия
Объект с цифровыми именами свойств
Формат записи массивов
const myArray = [1, 2, 3];
console.log(myArray);
const myArray2 = new Array (1, 2, 3);
console.log(myArray2);
- push (добавить в конец массива)
- pop (удалить элемент с конца массива, возвращает удаленный элемент)
- shift (удаляет первый элемент массива и возвращает его если присвоить его)
- unshift (добавить элемент в начале массива )
- forEach
- map
Методы массивов - функции высшего порядка в массивах (функции, методы протатипов)
const myArray = [1, 2, 3];
console.log(myArray);
myArray.push('a'); // добавить в конец
myArray.pop('b'); // удалить с конца
myArray.shift(4); // удаляет первый элемент
myArray.unshift(11); // добавить элемент в начале
Перебирает все элементы массива и выполняет определенные действия с каждым элементом. Метод не меняет оригинальный массив
Для каждого элемента массива будет вызывать колбек функцию.
const myArray = [1, 2, 3];
console.log(myArray);
Короткая запись
myArray.forEach(item => console.log(item * 2));
Обычная запись
myArray.forEach(function(item) {
console.log(item * 2);
});
forEach возвращает undefined, так как служит только для перебора элементов массива и выполнение определенных действий с каждым элементом перебора
const res = myArray.forEach(item => console.log(item * 2));
console.log(res); // undefined
Перебирает все элементы массива, выполняет определенные действия с каждым элементом как и forEach, но возвращает новый массив
const myArray = [1, 2, 3];
const newArray = myArray.map(item => item * 3);
Создание новых переменных относительно свойств объекта (на основе чвойств объекта)
Можно создать так
const userProfile = {
name: 'Vlad',
commentsQty: 23,
hasSignedAgreement: false,
};
const name = userProfile.name;
const commentsQty = userProfile.commentsQty;
const hasSignedAgreement = userProfile.hasSignedAgreementy;
Правильнее так
const {name, commentsQty} = userProfile;
или отдельно
const {hasSignedAgreement} = userProfile;
В фигурных скобках, название новых переменных, которые совпадают с ключами свойств объекта, на основе которого новые переменные и создаются (имя объект указывается справа, после знака присваивания). Порядок имен переменных в квадратных скобках не имеет значение, так как название переменных и ключа свойств одинаковые.
Почти тоже самое, что и в деструктуризации объектов, но фигурные скобки заменяем на квадратные и учитывем то, что порядок элементов в массиве имеет значение. Название переменных в квадратных скобках произвольные, но значения соответствуют индексу массива на основе которого переменные создаются.
const fruits = ['Apple', 'Banana'];
const [apple, fruitTwo] = fruits;
console.log(apple); // Apple
console.log(fruitTwo); // Banana
Если функция получает объект в качестве параметров, то можно применить деструктуризацию этого объекта, чтобы использовать только необходимые свойства
const userProfile = {
name: 'Vlad',
commentsQty: 0,
hasSignedAgreement: false,
};
const userInfo = ({name, commentsQty}) => {
if (!commentsQty) {
return console.log(`User ${name} has no comments`);
}
return console.log(`User ${name} has ${commentsQty} comments`);
};
userInfo(userProfile);
- if
- if ... else
- if ... else if (if ... else if ... else)
- switch
- тернарный оператор
if (условие) {
// блок кода, выполняется однократно, если условие правдиво
}
let val = 10;
if (val > 5) {
val+=20;
}
console.log(val);
if (условие) {
// блок кода, выполняется однократно, если условие правдиво
} else {
// блок кода, выполняется однократно, если условие ложно
}
let val = 10;
if (val < 5) {
val+=20;
} else {
val -= 20;
}
console.log(val);
if (условие 1) {
// блок кода, выполняется однократно, если условие 1 правдиво
} else if (условие 2) {
// блок кода, выполняется однократно, если условие 2 правдиво
} else {
// блок кода, выполняется однократно, если предыдущие условия ложны
}
const age = 18;
if (age >= 18) {
console.log('Is adult');
} else if (age >= 12) {
console.log('Is teenager');
} else {
console.log('Is child');
}
const sumPositiveNumbers = (a, b) => {
if (typeof(a) !== 'number' || typeof(b) !== 'number') {
return 'One of the arguments is not a number';
}
if (a <= 0 || b <= 0) {
return 'Numbers are not positive';
}
return a + b;
};
Альтернатива для if...if else...if
switch (выражение) {
case A:
// Действие если выражение === А
break;
case B:
// Действие если выражение === B
break;
default:
// действие по умолчанию
}
break
- остановка (выход). Если не установить, то проверка по case продолжится.
switch
- проверка на строгое равенство
const month = 5;
switch (month) {
case 12:
console.log('Декабрь');
break;
case 1:
console.log('Январь');
break;
case 2:
console.log('Февраль');
break;
default:
console.log('Это не зимний месяц');
}
У тернарного оператора три операндами Конструкция с тернанрным оператором - это выражение, а выражение всегда возвращает значение
Условие ? Выражение 1 : Выражение 2
- В условиях может быть любое выражение (проверка на true)
- Если Условие правдиво, то возвращается результат Выражения 1
- Если условие ложно - результат Выражения 2
Можно писать так:
Условие
? Выражение 1
: Выражение 2
Примеры:
const value = 11;
value
? console.log('Условие истенно')
: console.log('Условие ложно');
const value1 = 11;
const value2 = 25;
value1 && value2
? myFunction(value1, value2)
: myFunction();
let value = 11;
console.log(value >= 0 ? value : -value);
let res = value >= 0 ? value : -value;
console.log(res);
- for
- for...in...
- while
- do...while
- for...of...
for (Начальная инструкция; Условие; Итерационное действие) {
// Блок кода, выполняемый на каждой итерации
}
for (let i = 0; i < 5; i++) {
console.log(i);
}
Для перебора массивов не нужен цикл for
Лучше использовать функции высшего порядка - "forEach", "map", "reduce"
Вот как всё таки применяется for для массивов
const myArray = ['first', 'second', 'third'];
for (let i = 0; i < myArray.length; i++) {
console.log(myArray[i]);
}
Метод forEach
const myArray = ['first', 'second', 'third'];
myArray.forEach((element, index) => {
console.log(element, index);
});
// first 0
// second 1
// third 2
element
- каждый элемент массиваindex
- индекс каждого элемента (параметр опционален)
Выполняет блок кода, пока условие правдиво? если условие ложно, то не выполниться ни разу
while (Условие) {
// Блок кода, выполняемый на каждой итерации
}
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
Если не указать изменение i, то есть убрать i++, то цикл будет бесконечный
Выполнится как минимум один раз
do {
// Блок кода, выполняемый на каждой итерации (выполняется хотя бы один раз)
}
while (Условие)
let i = 0;
do {
console.log(i);
i++;
} while (i < 5);
Сначала выводится 0, увеличивается на единицу i++;
и уже после этого проверяется условие while (i < 5)
Применяется тогда, когда блок кода нужно выполнить хотя бы раз
Можно выполнять действия с каждым свойством объекта
for (key in Object) {
// Действия с каждым свойством объекта
// Значения свойства - Object[key]
}
key
- название переменной (название свойства объекта)
Object
- объект
Object[key]
- значение свойства
const myObject = {
x: 10,
y: true,
z: 'abc',
};
for (let key in myObject) {
console.log(`${key}:${myObject[key]}`);
}
// x:10
// y:true
// z:abc
const myObject = {
x: 10,
y: true,
z: 'abc',
};
Object.keys(myObject).forEach(key => {
console.log(key, myObject[key]);
});
// x 10
// y true
// z abc
Object.keys(myObject)
- метод keys переменной Object, для получения всех ключей объекта в виде массива (массив свойст) и далее перебор элементов этого массива forEach
Можно сразу перебирать значения свойств объекта
const myObject = {
x: 10,
y: true,
z: 'abc',
};
Object.values(myObject).forEach(value => {
console.log(value);
});
// 10
// true
// abc
Object.values(myObject)
- gj учение всех значений свойств объекта в виде массива
!!! ТАК ДЕЛАТЬ НЕ РЕКОМЕНДУЕТСЯ
const myArray = [true, 10, 'abc', null];
for (const key in myArray) {
console.log(myArray[key]);
}
// true
// 10
// abc
// null
for (Element of Iterable) {
// Действия с определенным элементом
}
Для строк
const myString = 'Hey';
for (const letter of myString) {
console.log(letter);
}
// H
// e
// y
Для массивов
const myArray = [true, 10, 'abc', null];
for (const element of myArray) {
console.log(element);
}
// true
// 10
// abc
// null
!!! FOR OF НЕ ДЛЯ ОБЪЕКТОВ
- Позволяют структурировать код
- Позволяюь избегать дублирования блоков кода
moduleOne.js => moduleTwo.js export... => import...
Связь модулей. Из модуля moduleOne.js экспортируются (переменные, функции и тд), а в moduleTwo.js импортируются с первого модуля
moduleOne.js Экспортируем функцию myName (теперь доступна для других модулей)
const myName = () => {
console.log('Vladyslav');
};
export default myName; // экспорт функции
moduleTwo.js
Импортируем функцию myName из модуля moduleOne.js
impoort printMyName from './moduleOne.js';
printMyName(); // Vladyslav
'./moduleOne.js'
- строка-путь ( ./ - находятся в одной папке, .js - можно опускать)
myName
и printMyName
- отличаются названия, что допускается при default экспорте
moduleOne.js
const one = 1;
const two = 'two';
export {
one,
two
}
moduleTwo.js
import {
one,
two
} from './moduleOne.js';
console.log(one); // 1
console.log(two); // two
Имена переменных должны совпадать, но их можно переименовать при импорте
moduleTwo.js
import {
one as oneRenamed
two
} from './moduleOne.js';
console.log(oneRenamed); // 1
console.log(two); // two
as
- указать новое имя, после импорта
- Модули должны быть одноцелевыми
- Распологайте все export инструкции внизу файла
- Распологайте все import инструкции сверху файла
- По возможности используйте export default
- Сначала import из внешних пакетов, а потом собственных
Синтаксис классов появился в ES6
С помощью классов можно создавать шаблоны, либо заготовки для объектов и потом, на основании этих заготовок создавать экземпляры объектов
class ...
- классы позволяют создавать прототипы для обюъектов
- на основании прототипов создаются экземпляры
- экземпляры могут иметь собственные свойства и методы
- экземпляры наследуют свойства и методы прототипов
class Comment {
constructor(text) {
this.text = text;
this.votesQty = 0;
}
upvote() {
this.votesQty +=1;
}
}
class
- ключевое слово
Comment
- название класса (PascalCase notation)
{}
- внутри всё что касается класса( свойтсва и методы)
constructor и upvote
- методы, в скобках ()
- опциональные параметры и далее тело {}
конкретного метода
this
- спец переменная указывает на экземпляр класса (ссылается на новый экземпляр)
const firstComment = new Comment('First comment');
new
- префиксный унарный оператор (вызывается функция constructor)
upvote
- унаследован свойства экземпляра
firstComment => Comment => Object
console.log(firstComment instanceof Comment);
console.log(firstComment instanceof Object);
// true
// true
const firstComment = new Comment('First comment');
firstComment.upvote();
console.log(firstComment.votesQty);
firstComment.upvote();
console.log(firstComment.votesQty);
firstComment.upvote();
console.log(firstComment.votesQty);
// 1
// 2
// 3
Есть ли у firstComment собственное свойство
const firstComment = new Comment('First comment');
console.log(firstComment.hasOwnProperty('text'));
console.log(firstComment.hasOwnProperty('votesQty'));
console.log(firstComment.hasOwnProperty('hasOwnProperty')); // наследуется от класса Comment
console.log(firstComment.hasOwnProperty('upvote')); // наследуется от класса Comment
// true
// true
// false
// false
const firstComment = new Comment('First comment');
const secondComment = new Comment('Second comment');
const thirdComment = new Comment('Third comment');
Метод доступен как свойство класса и не наследуется экземплярами класса
class Comment {
constructor(text) {
this.text = text;
this.votesQty = 0;
}
upvote() {
this.votesQty +=1;
}
static mergeComments(first, second) {
return `${first} ${second}`;
}
}
Comment.mergeComments('First comment.', 'Second comment.');
class NumbersArray extends Array {
sum() {
return this.reduce((el, acc) => acc += el, 0);
}
}
const myArray = new NumbersArray(2, 5, 7);
console.log(myArray);
myArray.sum();
Array
- родительский класс для NumbersArray
constructor
не нужен, так как расширяя Array
, конструктор родительского класса вызовется автоматически
mArray
=> NumbersArray
=> Array
=> Object
У каждого экземпляра есть скрыто свойство __proto__
Свойство prototype
класса - равно свойсту __proto__
любого экземпляра
Comment.prototype === firstComment.__proto__
Позволяют обрабатывать отложенные во времени события
Асинхронный запрос - не знаете, когда получите ответ (не сразу, а через какое-то время)
Промис - это обещание предоставить результат позже (возвращает ошибку, если предоставить невозможно)
- ожидание (pending) - промис создаётся
- исполнен (resolved) - результат получен
- откланен (rejected) - вернул ошибку
Только созданный промис в состоянии ожидания(pending)
const myPromise = new Promise((resolve, reject) => {
/*
*Выполнение асинхронных действий
*
* Внутри этой функциинужно в результате вызвать одну из функций resolve или reject
*
*/
});
-
new
- (вызывается constructor) создает новый экземпляр класса Promise(присутствует в js) и присвоен переменной -
(resolve, reject) => {}
- колбек функция -
resolve, reject
- два обязательных параметра -
{}
- в теле колбек функции нужно вызватьresolve
илиreject
-
resolve
- передать какой-то результат (данные) и когда была вызвана функцияresolve
, промис считается исполнен (меняется состояние с состояния ожидания) -
если возникла ошибка, то нужно вызвать функцию
reject
и передать ту ошибку, которая возникла. В таком случае промис считается откланенным
myPromise
.then(value => {
/*
* Дуйствие в случае успешного исполнения промиса
* Значение value - это значение, переданное в вызове функции resolve внутри Промиса
*/
})
.catch(error => {
/*
* Действие в случае отклонения Промиса
* Значение error - это значение, переданное в вызове функции reject внутри Промиса
*/
});
У объекта myPromise
доступны методы .then
и .catch
.
В .then
и .catch
в параметрах нужно предать функцию с одним параметром (value или error)
fetch('https://jsonplaceholder.typicode.com/todos/55')
.then(response => {
console.log(response);
return response.json();
})
.then(json => console.log(json));
.catch(error => console.error(error));
const getData = (url) =>
new Promise((resolve, reject) =>
fetch(url)
.then(response => response.json());
.then(json => resolve(json));
.catch(error => reject(error));
);
getData('https://jsonplaceholder.typicode.com/todos/55')
.then(data => console.log(data));
.catch(error => console.log(error.massage));
Специальный синтаксис для упрощения работы с промисами
Функция, которая вместо какого-то значения (undefined, cnстрокачисло и тд), возвращает промисами
Чтобы создать асинхронную функцию, нужно добавить ключевле слово acync
Традиционное объявление - ключевое слово перед функцией
acync function asuncFn() {
// Всегда возвращает Промис
};
Другие типы функций - ключевое слово после = (перед началом функции)
const asyncFn = async () => {
// Всегда возвращает Промис
};
const asyncFn = async () => {
return 'Success';
};
asyncFn()
.then(value => console.log(value));
const asyncFn = async () => {
throw new Error('There was an error!');
};
asyncFn()
.then(value => console.log(value))
.catch(error => console.log(error.message));
- async/await - это синтаксическая надстройка над промисами
- await синтаксис возможен только внутри async функции
- async функция всегда возвращает Promise
- async функция ожидает результата инструкции await и не выполняет последующие инструкции