Сетевые запросы. Колбэки, промисы, async/await

Содержание

Слайд 2

Колбэки - функции обратного вызова

Функции называют «асинхронными», потому что действие (загрузка скрипта)

Колбэки - функции обратного вызова Функции называют «асинхронными», потому что действие (загрузка
будет завершено не сейчас, а потом. Аргументом в такие функции передаётся функция (обычно анонимная), которая выполняется по завершении действия. Это и есть функция обратного вызова.

Слайд 3

Колбэки - функции обратного вызова

callback — функция, которая будет вызвана по завершению

Колбэки - функции обратного вызова callback — функция, которая будет вызвана по
асинхронного действия.
Обработка ошибок:

Слайд 4

Адская пирамида колбэков

Адская пирамида колбэков

Слайд 5

Промисы

Объект Promise (промис) используется для отложенных и асинхронных вычислений.

const newPromise = new

Промисы Объект Promise (промис) используется для отложенных и асинхронных вычислений. const newPromise
Promise((resolve, reject) => {
setTimeout(() => {
resolve('test');
}, 300);
});
newPromise.then((value) => {
console.log(value);
// "test"
});

Слайд 6

Промисы

Функции-потребители могут быть зарегистрированы (подписаны) с помощью методов .then, .catch и .finally.

Первый

Промисы Функции-потребители могут быть зарегистрированы (подписаны) с помощью методов .then, .catch и
аргумент метода .then – функция, которая выполняется, когда промис переходит в состояние «выполнен успешно», и получает результат.
Второй аргумент .then – функция, которая выполняется, когда промис переходит в состояние «выполнен с ошибкой», и получает ошибку.

Слайд 7

Промисы

new Promise(function(resolve, reject) { ... });

Функция, переданная в конструкцию new Promise, называется

Промисы new Promise(function(resolve, reject) { ... }); Функция, переданная в конструкцию new
исполнитель (executor). Когда Promise создаётся, она запускается автоматически. Она должна содержать «создающий» код, который когда-нибудь создаст результат.
Её аргументы resolve и reject – это колбэки, которые предоставляет сам JavaScript. Наш код – только внутри исполнителя.
Когда он получает результат, сейчас или позже – не важно, он должен вызвать один из этих колбэков:
resolve(value) — если работа завершилась успешно, с результатом value.
reject(error) — если произошла ошибка, error – объект ошибки.

Слайд 8

Промисы

Если мы хотели бы только обработать ошибку, то можно использовать null в

Промисы Если мы хотели бы только обработать ошибку, то можно использовать null
качестве первого аргумента: .then(null, errorFunc). Или можно воспользоваться методом .catch(errorFunc), который сделает тоже самое
.finally(() => alert("Промис завершён"))
функция в аргументе finally выполнится в любом случае, когда промис завершится: успешно или с ошибкой.

Слайд 9

Promise.all

Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve

Promise.all Promise.all([ new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1 new
=> setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
]).then(alert);

Слайд 10

Async/await

Специальный синтаксис для работы с промисами - «async/await»

async function newFunc() {
return

Async/await Специальный синтаксис для работы с промисами - «async/await» async function newFunc()
1;
}
// эта функция всегда возвращает промис

Слайд 11

Async/await

Ключевое слово await заставит интерпретатор JavaScript ждать до тех пор, пока промис

Async/await Ключевое слово await заставит интерпретатор JavaScript ждать до тех пор, пока
справа от await не выполнится. После чего оно вернёт его результат, и выполнение кода продолжится.

Слайд 12

Async/await

async function newFunc() {
let promise = new Promise((resolve, reject) => {

Async/await async function newFunc() { let promise = new Promise((resolve, reject) =>
setTimeout(() => resolve(1), 1000)
});
let result = await promise; // будет ждать, пока промис не выполнится (*)
alert(result); // 1
}
newFunc();

Слайд 13

Сетевые запросы

Для сетевых запросов в JavaScript можно использовать методы fetch (для современных

Сетевые запросы Для сетевых запросов в JavaScript можно использовать методы fetch (для современных браузеров) или XMLHttpRequest
браузеров) или XMLHttpRequest

Слайд 14

Fetch

let response = fetch(url, [options])
url – URL для отправки запроса.
options – дополнительные

Fetch let response = fetch(url, [options]) url – URL для отправки запроса.
параметры: метод, заголовки и так далее.
Свойства response -
status – код статуса HTTP-запроса, например 200.
ok – логическое значение: будет true, если код HTTP-статуса в диапазоне 200-299.

Слайд 15

Fetch

Методы для response:
response.text() – читает ответ и возвращает как обычный текст,
response.json() –

Fetch Методы для response: response.text() – читает ответ и возвращает как обычный
декодирует ответ в формате JSON,
response.formData() – возвращает ответ как объект FormData
response.blob() – возвращает объект как Blob (бинарные данные с типом),
response.arrayBuffer() – возвращает ответ как ArrayBuffer (низкоуровневое представление бинарных данных),
помимо этого, response.body – можно считывать тело запроса по частям

Слайд 16

Fetch

fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
.then(response => response.json())
.then(commits => console.log(commits));

Fetch fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits') .then(response => response.json()) .then(commits => console.log(commits));

Слайд 17

Fetch

Получить хедеры ответа:
response.headers
Получить хедер Content-Type ответа:
response.headers.get('Content-Type')

Fetch Получить хедеры ответа: response.headers Получить хедер Content-Type ответа: response.headers.get('Content-Type')

Слайд 18

Fetch

Установить хедеры запроса:
let response = fetch(URL, {
headers: {
Authentication: 'secret'
}
});

Fetch Установить хедеры запроса: let response = fetch(URL, { headers: { Authentication: 'secret' } });

Слайд 19

Fetch

Для отправки POST-запроса или запроса с другим методом, нам необходимо использовать fetch

Fetch Для отправки POST-запроса или запроса с другим методом, нам необходимо использовать
параметры:
method – HTTP метод, например POST,
body – тело запроса

let response = await fetch('/article/fetch/post/user', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(user)
});

Слайд 20

XMLHttpRequest

1. Создать XMLHttpRequest.
let xhr = new XMLHttpRequest();
2. Инициализировать его.
xhr.open(method, URL, [async, user,

XMLHttpRequest 1. Создать XMLHttpRequest. let xhr = new XMLHttpRequest(); 2. Инициализировать его.
password])
3. Послать запрос.
xhr.send([body])

Слайд 21

XMLHttpRequest

4. Слушать события на xhr, чтобы получить ответ.

xhr.onload = function() {
alert(`Загружено:

XMLHttpRequest 4. Слушать события на xhr, чтобы получить ответ. xhr.onload = function()
${xhr.status} ${xhr.response}`);
};
xhr.onerror = function() { // происходит, только когда запрос совсем не получилось выполнить
alert(`Ошибка соединения`);
};

Слайд 22

Задача 1

Создайте асинхронную функцию getTasks(), которая возвращает массив объектов категорий. Данные

Задача 1 Создайте асинхронную функцию getTasks(), которая возвращает массив объектов категорий. Данные
получать по ссылке: https://test-todoist.herokuapp.com/api/tasks
Необходимо вывести имена описание этих задач на странице в виде списка

Слайд 23

Задача 2

Создайте асинхронную функцию getUsers(names), которая получает на вход массив логинов

Задача 2 Создайте асинхронную функцию getUsers(names), которая получает на вход массив логинов
пользователей GitHub, запрашивает у GitHub информацию о них и возвращает массив объектов-пользователей.
Информация о пользователе GitHub с логином USERNAME доступна по ссылке: https://api.github.com/users/USERNAME.