Promises (Обещания)




Вводная информация




Методы об-та промиса


Так, как промис - стандартный об-т JS, то у него есть свои методы


then(onFulfilled, onRejected)



catch(onRejected)



Пример 2: простой промис

	let x = 10

	const promise = new Promise(function(resolve, reject){
		// УСЛОВИЕ ЗАДАЁМ МЫ 
		if(x === 11){
			resolve('ПРОМИС СРАБОТАЛ УСПЕШНО')
		}else{
			reject('ПРОМИС ОТКЛОНЁН')
		}
	})

	/*

		ВАРИАНТ ЗАПИСИ 1:

			- промис использует 2 метода then и catch
			- then при этом принимает только первый аргумент

	*/

	promise
		// СРАБАТЫВАЕТ, ЕСЛИ В КОНСТРУКТОРЕ ПРОМИСА СРАБАТЫВАЕТ Ф-ЦИЯ resolve
		// ЕЁ АРГУМЕНТ ПОПАДАЕТ В result
		.then(result => {
			console.log('вызов из then: ', result)
		})
		// СРАБАТЫВАЕТ, ЕСЛИ В КОНСТРУКТОРЕ ПРОМИСА СРАБАТЫВАЕТ Ф-ЦИЯ reject
		// ЕЁ АРГУМЕНТ ПОПАДАЕТ В error
		.catch(error => {
			console.log('вызов из catch: ', error)
		})


То же самое, но в другом варианте записи

	let x = 10

	const promise = new Promise(function(resolve, reject){
		// УСЛОВИЕ ЗАДАЁМ МЫ 
		if(x === 11){
			resolve('ПРОМИС СРАБОТАЛ УСПЕШНО')
		}else{
			reject('ПРОМИС ОТКЛОНЁН')
		}
	})

	/*

		ВАРИАНТ ЗАПИСИ 2:

			- промис использует только метод then
			- then при этом принимает два аргумента
			- то, что в прошлом варианте записи попало в метод catch, 
				тут попадает во второй аргумент метода then

	*/


	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 и вывести их в консоль. Использовать промис