Тема: catch и then
Показать сообщение отдельно
  #19 (permalink)  
Старый 28.07.2021, 09:56
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

Разобрался с поставленным вопросом, может кому нибудь будет полезно, поэтому сам отвечу на свой вопрос. Итак постановка задачи:
let promise1 = new Promise(function(resolve, reject) {
setTimeout(() => reject(new Error("Whoops!")), 1000);});
let result = promise1.catch(function(error){ alert('catch'); }).
then( function(result){ alert('then');});
в результате выполнения (т.е. при возникновении ошибки в promise1) будет вывод catch и then. Т.е. выполнится и код с catch и код с then.
Для ответа почему так происходит запишем вышеописанный код в альтернативном виде:
let promise1 = new Promise.... тут new Error
let promise2 = promise1.catch(function(error){ alert('catch'); });
let promise3 = promise2.then( function(result){ alert('then');});
это полностью эквивалентно ранее написанному коду. причем promise2 и promise3 потому что Promise.catch и Promise.then возвращает объект Promise.
И самое важное в данном случае- они разные. Т.е. catch().then() и т.д. в цепочке создает цепочку промисов и они разные!!!
Т.е. promise1 promise2 promise3 - это три промиса и они РАЗНЫЕ.
Теперь давайте представим, что при выполнении promise1 возникла ошибка. Сразу срабатывает promise1.catch. Находясь в promise1.catch
promise1 имеет статус resolved
promise2 имеет статус pending
promise3 имеет статус pending
как только заканчивается promise1.catch заканчивается и выполнение promise2. При этом статус promise2 становится resolved и выполнение его считается завершенным БЕЗ ОШИБОК.
затем идет следующая строка кода:
promise2.then( function(result){ alert('then');});
но promise2 завершился без ошибок!!! значит у него отработает then. Что мы и наблюдаем
Т.е. получается важен порядок. Вот в такой конфигурации
promise.catch().then( );
then будет отрабатываться ВСЕГДА. независимо от того, что произошло в promise.
Поэтому всегда необходимо ставить:
then().catch( )
Надеюсь кому нибудь будет полезно в понимании, спасибо
Ответить с цитированием