Я посмотрел на FAQ об синей птице , в котором упоминается, что .then(success, fail)
это антипаттерн . Я не совсем понимаю его объяснение, что касается попытки поймать. Что не так с этим следующим?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Кажется, что пример предлагает следующее как правильный путь.
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
Какая разница?
javascript
node.js
promise
bluebird
user2127480
источник
источник
then().catch()
является более читабельным, так как вам не нужно искать запятую и исследовать, является ли это обратным вызовом для ветки успеха или неудачи..catch
, вы не знаете, какой шаг вызвал проблему - внутри последнегоthen
или где-то еще в цепочке обещаний. Так что у него есть свой недостаток.some_promise_call() .then(function fulfilled(res) { logger.log(res) }, function rejected(err) { logger.log(err) })
Ответы:
.then()
Вызов возвратит обещание , что будет отвергнута в случае обратного вызова выдает ошибку. Это означает, что если ваш успехlogger
не удался , ошибка будет передана в следующий.catch()
обратный вызов, но не вfail
обратный вызов, который идет вместе сsuccess
.Вот схема потока управления :
Чтобы выразить это в синхронном коде:
Второй
log
(который аналогичен первому аргументу.then()
) будет выполняться только в том случае, если исключение не произошло. Помеченный блок иbreak
оператор чувствуют себя немного странно, это именно то ,try-except-else
для чего предназначен python (рекомендуется к прочтению!).catch
Регистратор будет также обрабатывать исключения из вызова успеха регистратора.Так много для разницы.
Аргумент заключается в том, что обычно вы хотите отлавливать ошибки на каждом этапе обработки и не должны использовать его в цепочках. Предполагается, что у вас есть только один конечный обработчик, который обрабатывает все ошибки, в то время как при использовании «antipattern» ошибки в некоторых из обратных вызовов не обрабатываются.
Тем не менее, этот шаблон на самом деле очень полезен: когда вы хотите обработать ошибки, которые произошли именно на этом шаге, и вы хотите сделать что-то совершенно иное, когда ошибки не произошло - то есть, когда ошибка не устраняется. Помните, что это ветвит ваш поток управления. Конечно, это иногда желательно.
Что вам пришлось повторить ваш обратный звонок. Ты скорее хочешь
Вы также можете рассмотреть возможность использования
.finally()
для этого.источник
.catch
будет отлавливать ошибки даже внутри функции успеха . Лично я нахожу это крайне неправильным, поскольку вы в конечном итоге получаете одну точку входа ошибки, которая может получить несколько ошибок от несколько действий, но это моя проблема. В любом случае - спасибо за информацию! У вас нет какого-либо инструмента онлайн-общения, которым вы готовы поделиться, чтобы я мог спросить кое-что еще? : PPromise
механика на этом сайте..done()
не является частью стандарта, не так ли? По крайней мере, MDN не перечисляет этот метод. Это было бы полезно.done
вещь Bluebird, которая в основном устарела изthen
-за обнаружения необработанного отказа.Два не совсем идентичны. Разница в том, что первый пример не поймает исключение, которое выдается в вашем
success
обработчике. Поэтому, если ваш метод должен только когда-либо возвращать разрешенные обещания, как это часто бывает, вам нужен завершающийcatch
обработчик (или еще одинthen
с пустымsuccess
параметром). Конечно, может случиться так, что вашthen
обработчик не сделает ничего, что потенциально может дать сбой, и в этом случае использование одного двухпараметрического параметраthen
может быть хорошо.Но я полагаю, что смысл текста, на который вы ссылаетесь, заключается в том, что
then
он по большей части полезен по сравнению с обратными вызовами в своей способности связывать несколько асинхронных шагов, и когда вы на самом деле делаете это, двухпараметрическая формаthen
слегка ведет себя не так, как ожидалось. по вышеуказанной причине. Это особенно нелогично, когда используется средняя цепь.Как человек, который сделал много сложных асинхронных вещей и столкнулся с такими углами больше, чем я хотел бы признать, я действительно рекомендую избегать этого анти-паттерна и придерживаться подхода отдельного обработчика.
источник
Рассматривая преимущества и недостатки обоих, мы можем сделать расчетное предположение относительно того, что соответствует ситуации. Это два основных подхода к выполнению обещаний. У обоих есть свои плюсы и минусы
преимущества
Недостатки
преимущества
Disavantages
catch
если вы хотите обработать ошибки, вызванные обратным вызовом успехаисточник
Простое объяснение:
В ES2018
это значит:
равно
источник
Использование
.then().catch()
позволяет вам включить Promise Chaining, которая требуется для выполнения рабочего процесса. Возможно, вам понадобится прочитать некоторую информацию из базы данных, затем вы захотите передать ее асинхронному API, а затем захотите манипулировать ответом. Вы можете отправить ответ обратно в базу данных. Обработка всех этих рабочих процессов с вашей концепцией выполнима, но очень сложна в управлении. Лучшим решением будет получениеthen().then().then().then().catch()
всех ошибок за один раз и возможность сохранения кода.источник
Использование
then()
иcatch()
помогает связать успех и обработчик ошибок на обещании.catch()
работает по обещаниюthen()
. Это обрабатывает,then()
не обрабатывает это.)1. let promiseRef: Promise = this. aTimetakingTask (false); 2. promiseRef 3. .then( 4. (result) => { 5. /* successfully, resolved promise. 6. Work on data here */ 7. }, 8. (error) => console.log(error) 9. ) 10. .catch( (e) => { 11. /* successfully, resolved promise. 12. Work on data here */ 13. });
Это имеет смысл, потому что обещание, возвращаемое
then()
не имеет ошибки, если обратный вызов позаботится об этом.источник
catch
обратного вызова кажется неправильной.Вместо слов хороший пример. Следующий код (если первое обещание разрешено):
идентичен:
Но с отклоненным первым обещанием это не идентично:
источник