Как работает код? Прохожу уроки по 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))
Этот код представляет собой собственную реализацию промисов в 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 отрабатывают в нужной последовательности независимо от порядка их вызова.
Этот код представляет собой собственную реализацию промисов в 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 отрабатывают в нужной последовательности независимо от порядка их вызова.