catch и then
Уважаемые господа! вот опять вопрос, может быть кто подскажет....
есть такой участок кода: this.readServerInfo( options ) .catch( function( errorMessage ){ .... }) .then( function( result ){ ..... }) в функции readServerInfo генерируется ошибка: throw new Error( error ); срабатывает catch как и положено. Но! потом срабатывает и then! и только в этом месте, в других участках кода с подобной конструкцией все правильно. Причем, если поменять местами : this.readServerInfo( options ) .then( function( result ){ ..... }) .catch( function( errorMessage ){ .... }) то then уже не срабатывает. Так и должно быть? |
Цитата:
Вот пример let promise = new Promise(function(resolve, reject) { setTimeout(() => reject(new Error("Whoops!")), 1000); }); promise.then( result => alert(result), // не будет запущена error => alert(error + ' из then') // выведет "Error: Whoops!" спустя одну секунду ); promise.catch(err => alert(err + ' из catch')) Сколько их местами не меняй - выполнятся "оба". Точнее выполнится вторая функция из then, ну и конечно функция из catch. Т.е. так, как написано в букваре https://learn.javascript.ru/promise-...-catch-finally Цитата:
|
Цитата:
|
Цитата:
|
с конструкцией
promise.then( result => alert(result), // не будет запущена error => alert(error + ' из then') // выведет "Error: Whoops!" спустя одну ); все понятно, речь о конструкции promise.then().catch() вот в таком вариант сработает только catch а вот в таком promise.catch().then() сначала catch() потом then() интуитивно типа понятно - но нифига ладно бы сначала then, потом catch, а так непонятно |
Цитата:
Если в then передавали 2 функции - при ошибке будет вызываться вторая. Ну и catch вызовется тоже. Последовательность вызовов определяет прогер promise.catch().then() // или promise.then().catch() |
fxobject, если все еще есть непонятки - начинай делать свой тестовый пример...
На нем все и будет ясно. |
Если убрать вторую функцию из then
let promise = new Promise(function(resolve, reject) { setTimeout(() => reject(new Error("Whoops!")), 1000); }); promise.then( result => alert(result) // не будет запущена ); promise.catch(err => alert(err + ' из catch')) Как не меняй местами... При ошибке будет выполняться только catch. |
then в цепочке после cacth сработает всегда, получив на вход в первую функцию то, что вернул catch, или получив во вторую функцию ошибку которую бросит catch.
|
просто какой то звиздец. Уважаемый ksa, я понимаю вашу мудрость, но ваш пример совсем не под вопрос:
разбираем ваш пример. 1 созданый промис генерирует ошибку. - согласен 2 дважды организован вызов промиса. один с then и внутри как обработчик состояния success так и обработчик ошибки (к чему этот пример? я спрашивал совсем другое). В данном вызове конечно отработает только обработчик ошибки - тут вопросов нет 3 следующий вызов. А он только с catch. А он извиняюсь зачем? Вы совсем не читаете вопрос? В этом вызове также отработает код обработки ошибки. Ну и где тут ответ на вопрос? Внимание следим за руками - я спрашивал promise.then().catch() Вы не видите разницу с вашим примером? вот в такой комбинации promise.catch().then() отработает код в catch и в then. В принципе я разобрался почему так, но блин совсем не потой фигне вашего примера. на самом деле ответ заключается в том что promise.catch() возврашает промис у которого then в proto и наоборот promise.then() возврашает промис у которого catch() также в прото. заходим отладчиком и смотрим почему. И прекратите вашу брудершафтную тыкалку. О великий Рудиги |
Цитата:
Делай работающий пример на котором ты имеешь некие особенности. |
Цитата:
Ты про это где-то писал? |
Цитата:
|
уважаемый ksa - я не хочу чтобы вы мне отвечали, не хочу читать ваши опусы и демонстрацию ваших сверх знаний. Прошу вас - не отвечайте больше на мои темы!
по вышеупомянутому вопросу: вот пример с результатом: let promise = new Promise(function(resolve, reject) { setTimeout(() => reject(new Error("Whoops!")), 1000); }); let result = await promise. catch(function(error){ return 1; }). then( function(result){ return 2; }); отработают и catch и then на выходе будет result = 2 порядок имеет значение |
Цитата:
Но я решил потестить твой чудо-пример let promise = new Promise(function(resolve, reject) { setTimeout(() => reject(new Error("Whoops!")), 1000); }); let result = await promise. catch(function(error){ alert('catch'); return 1; }). then( function(result){ alert('then'); return 2; }); Так он дает ошибку Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules Т.ч. с работающими примерами у тебя пока туган. :( |
туган у тебя. обернуть пример в функцию async и вызвать ее для тебя непосильная задача на сообразительность. Общаться абстрактными категориями, смыслами для тебя не вариант. Тупо следовать написанному и ни шага в сторону - вот твой удел.
|
fxobject, ты почаще в зеркало смотри... :D
Похоже ты свой портрет нарисовал. |
ну и хера ты лез отвечать? доминантность свою некуда деть? Мастер класс показать? Ты тут похоже первый парень на деревне? Какой смысл всех этих чатов, когда обязательно найдется умник, диалог с которым всегда перерастет в перепалку? И ведь не отстанет же подлец.
Знает же крысеныш что я прав, но будет до последнего хамить. Короче - идите батенька в сад. к черту вас |
Разобрался с поставленным вопросом, может кому нибудь будет полезно, поэтому сам отвечу на свой вопрос. Итак постановка задачи:
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( ) Надеюсь кому нибудь будет полезно в понимании, спасибо |
Цитата:
|
так точно )
|
Часовой пояс GMT +3, время: 20:04. |