Как работает код? Прохожу уроки по 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
172 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир