Промисы - Синхронные Flashcards

1
Q

Промисы

A

Промисы - объект JS, который возвращает промис.
Код внутри конструктора Promise предназначен для выполнения синхронно.
Если бы мы запустили синхронную функцию задержки delay(), то движок бы ничем другим заниматься в это время не мог. Мы помним, что выполнение синхронного кода — строка за строкой. То есть пока delay() не выполнится до конца, к следующей строке интерпретатор не перейдёт.
Есть методы.
Есть скрытые свойства, которые отображают состояние.
Используются: при работе с сервисом, чтение файлов, подписки на события.
Промис создается с помощью конструктора Промис, код который в колбеке, который мы передаем выполняется синхронно, в нем получаем два аргумента resolve и reject, в соответствии с этими аргументами можем менять состояние промиса. На изменение состояние подписываемся с помощью метода .then (используем при состоянии resolve). Метод .catch используется для состояния reject., также возвращает новый промис и на него также можно подписаться. Метод .finaly принимает колбэк, срабатывает всегда, вне зависимости от того, что произошло с нашим промисом.
finally - undefined -т.к. ничего не принимает и не возвращает - всегда, нельзя ничего возвращать.

resolve, reject - вызывается в конструкторе промиса, где меняется состояние промиса.
.then - принимает колбэк, подписчики на состояние промиса.

Методы:
Кстати метод .then() может принимать два колбека, второй будет делать тоже самое что и метод .catch().
Итак, давайте поговорим более подробно об этих методах:
.then() - срабатывает в случае резолва промиса и вызывает переданный в себя коллбек, в который поместит то чем был зарезолвлен промис (то что мы передали в функцию resolve()). После отработки возвращает новый промис, который резолвится автоматически, если мы не возвращаем из метода .then() нового промиса и не возникает никаких ошибок. В случае возникновения ошибки, возвращаемый промис реджектится.
.catch() - срабатывает в случае реджекта промиса и вызывает переданный в себя коллбек, в который поместит то чем был зареджектен промис (то что мы передали в функцию reject()). После отработки возвращает новый промис, который резолвится автоматически, если мы не возвращаем из метода .catch() нового промиса и не возникает никаких ошибок. В случае возникновения ошибки, возвращаемый промис реджектится.
.finally() - срабатывает в любом случае, независимо от резолва или реджекта промиса и вызывает переданный в себя коллбек, в который ничего не поместит. После отработки возвращает новый промис, который резолвится автоматически, если мы не возвращаем из метода .then() нового промиса и не возникает никаких ошибок. В случае возникновения ошибки, возвращаемый промис реджектится.

Статистический метод Promise.all, так как находится у самого класса.
const otherPromise = Promise.all([promise1, promise2]) - обернет другой промис зарезолвится в тот момент, когда зарезолвятся эти два промиса. Этот промис связан с двумя этими промисами.

const otherPromise = Promise.allSettled([promise1, promise2]) - возвращает другой промис, зарезолвится в тот момент, когда все промисы уйдут из состояния pending (resolve или reject). Может приходить объекты, где сообщается статус о наших промисах.

otherPromise.then(() => {
const dataFromGoogle = results[0]
const userFromDB = results[1]
console.log(dataFromGoogle.data.vacancies + ‘; ‘ userFromDB.name)
})
.catch (() => {
console.log(‘initial failed. Try latter’)
})

Состояния:
+ Ожидание (pending). Начальное состояние, операция ещё не завершена. В этом состоянии промис ожидает завершения асинхронной операции.
+ Исполнено (fulfilled). Операция завершена успешно. В этом случае промис возвращает результат, который можно обработать.
+ Отклонено (rejected). Операция завершена с ошибкой. В этом случае промис возвращает ошибку, которую необходимо обработать.

JS это однопоточный язык программирования, а это значит, что в конкретный момент времени движок может выполнять не более одной строки кода. Такое выполнение кода (строка за строкой) называется синхронным.

readFile - не возвращает промисы, работает на колбэках, либо работает синхронно блокирует поток.
readFilePromise - работает в новых версиях на промисах.
fetch() - работает с промисами. Под капопотом создает newPromise. Объект JS, который имеет состояния и на них мы сможем подписываться.

Создание промиса:
function getNumber() {
const promise = new Promise ((resolve, reject) => {
resolve(Math.random()) })
return promise }
}
или
const promise = Promise.resolve(Math.random())
Пример:
const lastPromise = findUserInDB(1)
.then(user => {console.log(user)})
.then(user => findUserInDB(user.friend))
.then(friend1 => {console.log(friend1)
return friend1})
.then(friend1 => findUserInDB(friend1 friend))
.then(friend2 => console.log(friend2.name)

Самый распространенный кейс:
const getData = () =>
new Promise((res, rej) => {
setTimeout(() => {
res(‘some data’);
// rej(“some error”);
}, 1000);
});

getData()
.then((data) => {
console.log(“then1”, data);
return new Promise((res, rej) => {
setTimeout(() => {
// res(“some data from request2”);
rej(“some error”);
}, 2000);
});
})
.catch((data) => {
console.log(“catch1”, data);
// return;
})
.finally(() => {
setLoader(false)
})

! Редко: Метод .then может принимать в себя два колбэка, во второй колбэк записывается .catch

const getData = () =>
new Promise((res, rej) => {
setTimeout(() => {
res(‘some data’);
// rej(“some error”);
}, 1000);
});

getData()
.then((data) => {
console.log(“then1”, data);
return new Promise((res, rej) => {
setTimeout(() => {
// res(“some data from request2”);
rej(“some error”);
}, 2000);
});
})
.catch((data) => {
console.log(“catch1”, data);
// return;
}, (reason) => {
console.log(‘catch’, reason)
})

Состояния:

const promise = new Promise ((resolve, reject) => {

}) - класс, т.е. структура, которая помогает создавать однотипные объекты.
() - конструктор, метод - функция.
console.log(promise) // Promise {<pending>}</pending>

const promise = new Promise<void> ((resolve, reject) => {
resolve()
})
console.log(promise) // Promise {<fulfilled>}</fulfilled></void>

const promise = new Promise<void> ((resolve, reject) => {
reject()
})
console.log(promise) // Promise {<rejected>}</rejected></void>

const promise = new Promise<void> ((resolve, reject) => {
setTimeOut(() => {resolve()},2000) - будет работать синхронно,
если не обернут в промис, то асинхронно.
reject()
})
console.log(promise) // Promise {<rejected>}
Т.к. был переход на последнее состояние rejected.</rejected></void>

Выполнение промосификации:
const readFilePromise = (path: string): Promise <any> => {
return new Promise((resolve, reject) => {
readFile(path, (err, data) => {
if (err) {
reject(new Error('file read error'));
}
resolve(data)
}
}
}</any>

Можем узнать состояние:
const file = readFilePromise(‘index.js’)
console.log(file) // Promise {<pending>}</pending>

Вывести файл:
Когда промис заресолвится, то просим передать нашего подписчика:
readFilePromise(‘index.js’).then( (data) => {
console.log(data)
return data
})
.then((data) => {
writeFileSync(path,data)
})
then() - метод, т.е. подписка на выполнение промиса. Каждый раз может совершаться подписка.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly