Как работает код? Прохожу уроки по JS и там был реализован класс MyPromise для более глубокого понимания. Но мне не до конца понятно, как этот код работает. Почему finally() отрабатывает, после then() хотя стоит перед ним.class MyPromise {
constructor(callback) {
this.onCatch = null
this.onFinally = null
this.thenCbs = []
this.isRejected = false
function resolver(data) {
if (this.isRejected) {
return
}
if (this.onFinally) {
this.thenCbs.forEach(cb => {
data = cb(data)
})
this.onFinally()
}
}
function rejecter (error) {
this.isRejected = true
if (this.onCatch) {
this.onCatch(error)
}
if (this.onFinally) {
this.onFinally()
}
}
callback(resolver.bind(this), rejecter.bind(this))
}
then(cb) {
this.thenCbs.push(cb)
return this
}
catch(cb) {
this.onCatch = cb
return this
}
finally(cb) {
this.onFinally = cb
return this
}
}
const promise = new MyPromise((resolver, rejecter) => {
setTimeout(() => {
rejecter('Some error')
resolver(2)
}, 2000)
})
promise
.then(num => num *=2)
.catch(err => console.error(err))
.then(num => num *= 3)
.finally(() => console.log('finaly'))
.then(num => console.log('Done!', num))

21 Авг 2019 в 06:58
146 +1
1
Ответы
1

Этот код представляет собой собственную реализацию промисов в JavaScript. Здесь создается класс MyPromise, который имеет методы then, catch и finally для работы с промисами.

Когда создается экземпляр класса MyPromise с переданным колбэком (resolver, rejecter), то внутри этого экземпляра создаются свойства и методы для обработки then-цепочки. Колбэк вызывается с функциями resolver и rejecter.

Внутри функции resolver происходит проверка, был ли промис отклонен (isRejected). Затем добавленные в then-цепочку колбэки вызываются с переданными данными, а затем вызывается функция onFinally.

Внутри функции rejecter устанавливается флаг isRejected, вызывается колбэк onCatch, если он был добавлен, а затем вызывается колбэк onFinally.

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

В конце кода создается экземпляр промиса promise, который сперва должен отклониться (rejecter('Some error')), а затем принять свое значение (resolver(2)).

Далее выполняется последовательная обработка then-цепочки: умножение на 2, вывод ошибки в случае ее возникновения, умножение на 3, вывод "finaly", последний then-колбэк с выводом результата умножения и сообщением "Done!".

Таким образом, благодаря сочетанию колбэков и механизма then/catch/finally реализуется управление последовательностью действий при выполнении промиса. Код работает таким образом, что благодаря встроенному добавлению колбэков в then-цепочку, функции then, catch и finally отрабатывают в нужной последовательности независимо от порядка их вызова.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир