Promises (Обещания)
Вводная информация
- 1. Промисы это специальные JS объекты, которые упрощают работу с коллбеками
- 2. Промисы могут находиться в трёх состояниях:
- ожидание (pending): начальное состояние, не выполнено и не отклонено
- выполнено (fulfilled): операция завершена успешно
- отклонено (rejected): операция завершена с ошибкой
-
3. Технически промис это об-т, конструктор которого принимает функцию с двумя аргументами,
которые сами являются функциями
Пример 1: простое создание экземпляра об-та промиса, который находится в состоянии
ожидания (pending)
const promise = new Promise(function(resolve, reject) {});
- 4. Обычно промис применяется для обработки результатов действия асинхронных операций
(см. статью Цикл (loop) javascript)
- 5. ВАЖНО Условия if выполнения ф-ций
resolve или reject, задаём мы (см пример 2). Названия ф-ций также могут быть
любыми: resolve и reject просто общепринятые названия
Методы об-та промиса
Так, как промис - стандартный об-т JS, то у него есть свои методы
then(onFulfilled, onRejected)
Пример 2: простой промис
let x = 10
const promise = new Promise(function(resolve, reject){
if(x === 11){
resolve('ПРОМИС СРАБОТАЛ УСПЕШНО')
}else{
reject('ПРОМИС ОТКЛОНЁН')
}
})
promise
.then(result => {
console.log('вызов из then: ', result)
})
.catch(error => {
console.log('вызов из catch: ', error)
})
То же самое, но в другом варианте записи
let x = 10
const promise = new Promise(function(resolve, reject){
if(x === 11){
resolve('ПРОМИС СРАБОТАЛ УСПЕШНО')
}else{
reject('ПРОМИС ОТКЛОНЁН')
}
})
promise
.then(
(result) => {
console.log('вызов из then - срабатывает первый аргумент: ', result)
},
(error) => {
console.log('вызов из then - срабатывает второй аргумент: ', error)
})
Пример 3. Обычно промис используется для работы с асинхронными ф-циями
let x = 10
const promise = new Promise(function(resolve, reject){
if(x === 10){
setTimeout(() => {
resolve('ПРОМИС СРАБОТАЛ УСПЕШНО')
}, 1000);
}else{
setTimeout(() => {
reject('ПРОМИС ОТКЛОНЁН')
}, 1000);
}
})
promise
.then(result => {
console.log('вызов из then: ', result)
})
.catch(error => {
console.log('вызов из catch: ', error)
})
Цепочка методов об-та промиса всегда должна заканчиваться либо методом catch, либо методм then с двумя аргументами.
Иначе возможная ошибка останется неперехваченной
Промисы и AJAX
Чаще всего промисы используются для работы с асинхронными операциями таким, как AJAX
Пример 4. Промис и AJAX
const getData = () => {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest()
request.addEventListener('readystatechange', (e) => {
if (e.target.readyState === 4 && e.target.status === 200) {
const data = JSON.parse(e.target.responseText)
resolve(data)
} else if (e.target.readyState === 4) {
reject('An error has taken place')
}
})
request.open('GET', `https://jsonplaceholder.typicode.com/todos/1`)
request.send()
})
}
getData()
.then((data) => {
console.log('Data: ', data)
})
.catch((err) => {
console.log(`Error: ${err}`)
})
Упражнения
1. Создать промис. Задать переменную y = 0. Если переменная y = 0, вывести в консоль 'ВЫПОЛНЕНО', если
= 1, 'ОТКЛОНЕНО'
2. Создать промис. Задать переменную y = 0. Если переменная y = 0, вывести в консоль 'ВЫПОЛНЕНО', если
= 1, 'ОТКЛОНЕНО'. Значение переменной 0 или 1 должно выставляться случайно при перезагрузке страницы
3. Создать промис. Задать переменную x = true. Если переменная x = true, вывести в консоль 'ВЫПОЛНЕНО',
если = false, 'ОТКЛОНЕНО'. Значение переменной true / false должно выставляться случайно при
перезагрузке страницы. Ф-ции resolve и reject оборачивать в setTimeout.
С любым временным интервалом
4. Получить список постов с адреса https://jsonplaceholder.typicode.com/posts и вывести их в консоль.
Использовать промис