Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   catch и then (https://javascript.ru/forum/node-js-io-js/82889-catch-i-then.html)

fxobject 27.07.2021 21:32

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 уже не срабатывает.
Так и должно быть?

ksa 27.07.2021 21:56

Цитата:

Сообщение от fxobject
Причем, если поменять местами :
this.readServerInfo( options )
.then( function( result ){ ..... })
.catch( function( errorMessage ){ .... })
то then уже не срабатывает.
Так и должно быть?

При перемене мест слагаемых сумма меняться не должна. :nono:
Вот пример
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
Цитата:

Если мы хотели бы только обработать ошибку, то можно использовать null в качестве первого аргумента: .then(null, errorHandlingFunction). Или можно воспользоваться методом .catch(errorHandlingFunction), который сделает тоже самое

ksa 27.07.2021 21:59

Цитата:

Сообщение от fxobject
в других участках кода с подобной конструкцией все правильно

Скорее всего там просто не передавали вторую функцию в then...

ksa 27.07.2021 22:06

Цитата:

Сообщение от ksa
Сколько их местами не меняй - выполнятся "оба".

При перемене мест изменится только очередность вызовов... :)

fxobject 27.07.2021 22:08

с конструкцией
promise.then(
result => alert(result), // не будет запущена
error => alert(error + ' из then') // выведет "Error: Whoops!" спустя одну );
все понятно, речь о конструкции
promise.then().catch()
вот в таком вариант сработает только catch
а вот в таком
promise.catch().then()
сначала catch() потом then()
интуитивно типа понятно - но нифига
ладно бы сначала then, потом catch, а так непонятно

ksa 27.07.2021 22:11

Цитата:

Сообщение от fxobject
все понятно

Видать не все понятно тебе... Хотя я даже пример для тебя сделал. :(

Если в then передавали 2 функции - при ошибке будет вызываться вторая.
Ну и catch вызовется тоже.
Последовательность вызовов определяет прогер
promise.catch().then()
// или
promise.then().catch()

ksa 27.07.2021 22:15

fxobject, если все еще есть непонятки - начинай делать свой тестовый пример...

На нем все и будет ясно.

ksa 27.07.2021 22:19

Если убрать вторую функцию из 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.

Aetae 27.07.2021 22:27

then в цепочке после cacth сработает всегда, получив на вход в первую функцию то, что вернул catch, или получив во вторую функцию ошибку которую бросит catch.

fxobject 27.07.2021 22:28

просто какой то звиздец. Уважаемый ksa, я понимаю вашу мудрость, но ваш пример совсем не под вопрос:
разбираем ваш пример.
1 созданый промис генерирует ошибку. - согласен
2 дважды организован вызов промиса. один с then и внутри как обработчик состояния success так и обработчик ошибки (к чему этот пример? я спрашивал совсем другое). В данном вызове конечно отработает только обработчик ошибки - тут вопросов нет
3 следующий вызов. А он только с catch. А он извиняюсь зачем? Вы совсем не читаете вопрос? В этом вызове также отработает код обработки ошибки.
Ну и где тут ответ на вопрос?
Внимание следим за руками - я спрашивал
promise.then().catch()
Вы не видите разницу с вашим примером?
вот в такой комбинации
promise.catch().then() отработает код в catch и в then.
В принципе я разобрался почему так, но блин совсем не потой фигне вашего примера.
на самом деле ответ заключается в том что
promise.catch() возврашает промис у которого then в proto
и наоборот
promise.then() возврашает промис у которого catch() также в прото.
заходим отладчиком и смотрим почему.
И прекратите вашу брудершафтную тыкалку. О великий Рудиги

ksa 27.07.2021 22:33

Цитата:

Сообщение от fxobject
Внимание следим за руками - я спрашивал
promise.then().catch()
Вы не видите разницу с вашим примером?

Я вообще твоего примера не вижу... Пока только есть некий рассказ и возмущения.

Делай работающий пример на котором ты имеешь некие особенности.

ksa 27.07.2021 22:34

Цитата:

Сообщение от fxobject
на самом деле ответ заключается в том что
promise.catch() возврашает промис у которого then в proto
и наоборот
promise.then() возврашает промис у которого catch() также в прото.

А я про это знал? :D
Ты про это где-то писал?

ksa 27.07.2021 22:35

Цитата:

Сообщение от fxobject
И прекратите вашу брудершафтную тыкалку.

Это не деловая переписка. Это свободный форум...

fxobject 27.07.2021 22:47

уважаемый 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
порядок имеет значение

ksa 27.07.2021 22:56

Цитата:

Сообщение от fxobject
вот пример с результатом:
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
порядок имеет значение

Нет желания отвечать - не отвечай, дело хозяйское... :D

Но я решил потестить твой чудо-пример
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

Т.ч. с работающими примерами у тебя пока туган. :(

fxobject 27.07.2021 22:59

туган у тебя. обернуть пример в функцию async и вызвать ее для тебя непосильная задача на сообразительность. Общаться абстрактными категориями, смыслами для тебя не вариант. Тупо следовать написанному и ни шага в сторону - вот твой удел.

ksa 27.07.2021 23:01

fxobject, ты почаще в зеркало смотри... :D
Похоже ты свой портрет нарисовал.

fxobject 27.07.2021 23:07

ну и хера ты лез отвечать? доминантность свою некуда деть? Мастер класс показать? Ты тут похоже первый парень на деревне? Какой смысл всех этих чатов, когда обязательно найдется умник, диалог с которым всегда перерастет в перепалку? И ведь не отстанет же подлец.
Знает же крысеныш что я прав, но будет до последнего хамить. Короче - идите батенька в сад. к черту вас

fxobject 28.07.2021 09:56

Разобрался с поставленным вопросом, может кому нибудь будет полезно, поэтому сам отвечу на свой вопрос. Итак постановка задачи:
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( )
Надеюсь кому нибудь будет полезно в понимании, спасибо

Alexandroppolus 28.07.2021 12:42

Цитата:

Сообщение от fxobject
Вот в такой конфигурации
promise.catch().then( );
then будет отрабатываться ВСЕГДА.

только если в колбэке в catch не случилась ошибка

fxobject 28.07.2021 14:56

так точно )


Часовой пояс GMT +3, время: 20:04.