Яка різниця?
.then()
Виклик поверне обіцянку , що буде відкинута в разі зворотного виклику видає помилку. Це означає, що коли ваш успіх logger
не вдасться, помилка буде передана наступному .catch()
зворотному дзвінку, але не до fail
зворотного дзвінка, який йде поряд із success
.
Ось схема управління потоком :
Щоб виразити це в синхронному коді:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
Другий log
(як на перший аргумент .then()
) буде виконаний лише у тому випадку, якщо не сталося жодного винятку. Позначений блок і break
вираз виглядають дещо дивним, це насправді те, що має try-except-else
для python (рекомендується читати!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
Журнал catch
також буде обробляти винятки з виклику реєстратора успіху.
Стільки для різниці.
Я не зовсім розумію його пояснення щодо спроби та лову
Аргумент полягає в тому, що зазвичай ви хочете вловлювати помилки на кожному етапі обробки, і що ви не повинні використовувати їх у ланцюгах. Очікується, що у вас є лише один кінцевий обробник, який обробляє всі помилки - в той час, коли ви використовуєте "антипатерн", помилки в деяких тодішніх зворотних викликах не обробляються.
Однак ця модель насправді дуже корисна: коли ви хочете обробити помилки, що трапилися саме на цьому кроці, і ви хочете зробити щось зовсім інше, коли не сталася помилка - тобто коли помилка не може бути усунена. Майте на увазі, що це розгалужує ваш контрольний потік. Звичайно, це іноді бажано.
Що поганого в цьому нижче?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Щоб вам довелося повторити зворотний дзвінок. Ви швидше хочете
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Ви також можете розглянути можливість використання .finally()
для цього.
then().catch()
є більш читабельним, тому що вам не потрібно шукати кому і досліджувати, чи це зворотній виклик для успіху чи помилки.