Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.07.2021, 21:32
Аспирант
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 76

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 уже не срабатывает.
Так и должно быть?
Ответить с цитированием
  #2 (permalink)  
Старый 27.07.2021, 21:56
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,319

Сообщение от fxobject
Причем, если поменять местами :
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
Цитата:
Если мы хотели бы только обработать ошибку, то можно использовать null в качестве первого аргумента: .then(null, errorHandlingFunction). Или можно воспользоваться методом .catch(errorHandlingFunction), который сделает тоже самое
Ответить с цитированием
  #3 (permalink)  
Старый 27.07.2021, 21:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,319

Сообщение от fxobject
в других участках кода с подобной конструкцией все правильно
Скорее всего там просто не передавали вторую функцию в then...
Ответить с цитированием
  #4 (permalink)  
Старый 27.07.2021, 22:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,319

Сообщение от ksa
Сколько их местами не меняй - выполнятся "оба".
При перемене мест изменится только очередность вызовов...
Ответить с цитированием
  #5 (permalink)  
Старый 27.07.2021, 22:08
Аспирант
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 76

с конструкцией
promise.then(
result => alert(result), // не будет запущена
error => alert(error + ' из then') // выведет "Error: Whoops!" спустя одну );
все понятно, речь о конструкции
promise.then().catch()
вот в таком вариант сработает только catch
а вот в таком
promise.catch().then()
сначала catch() потом then()
интуитивно типа понятно - но нифига
ладно бы сначала then, потом catch, а так непонятно
Ответить с цитированием
  #6 (permalink)  
Старый 27.07.2021, 22:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,319

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

Если в then передавали 2 функции - при ошибке будет вызываться вторая.
Ну и catch вызовется тоже.
Последовательность вызовов определяет прогер
promise.catch().then()
// или
promise.then().catch()
Ответить с цитированием
  #7 (permalink)  
Старый 27.07.2021, 22:15
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,319

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

На нем все и будет ясно.
Ответить с цитированием
  #8 (permalink)  
Старый 27.07.2021, 22:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,319

Если убрать вторую функцию из 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.
Ответить с цитированием
  #9 (permalink)  
Старый 27.07.2021, 22:27
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,927

then в цепочке после cacth сработает всегда, получив на вход в первую функцию то, что вернул catch, или получив во вторую функцию ошибку которую бросит catch.
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 27.07.2021, 22:28
Аспирант
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 76

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разве try catch в dev библиотеках не затрудняет разработку? Megabyte Общие вопросы Javascript 10 12.07.2021 02:03
Что записать в блок catch (err)? antonhauff Events/DOM/Window 10 20.02.2018 12:10
Баг Aurora promise catch Octane Оффтопик 2 27.03.2014 23:37
Не срабатывает try...catch kazimira6 Общие вопросы Javascript 4 22.07.2011 12:49
try и catch подскажите как правильно сделать Jekel Javascript под браузер 9 31.03.2010 09:33