поймать
Это хорошо известный способ обработки ошибок в коде для обещания. Легко учиться и просто использовать.
Но я заметил, что многие программисты, которые только знают обещания поверхностно, думают, что поймать
Является ли единственный способ обрабатывать ошибки в обещаниях кода или, по крайней мере, это всегда предпочтительнее.
И это просто не правда. Я использую поймать
Очень часто и это определенно имеет свое место, но в этой статье я хочу доказать вам, что для того, чтобы справиться с ошибками более тонких способов, вам иногда нуждаются в других средствах борьбы с исключениями.
Это научит нас не только о поймать
Сам, но также невидит интересные детали о тогда
Способ!
Таким образом, в этой статье мы начнем с участия больше о тогда
метод сначала. Знание его глубоко позволит нам решить «тайну» поймать
– Что это на самом деле, как именно это работает и когда он должен и не должен использоваться.
Давай начнем!
Тонкости тогдашнего
В реальном мире применение, самый распространенный способ использовать тогда
Метод – просто пройти один аргумент – функция обратного вызова:
somePromise.then(result => { // do something with `result` return newResult; });
Когда uDepromise
Решает (например, отделка HTTP-запроса), наш обратный вызов передан тогда
вызывается со значением, к которому uDepromise
разрешили (например, JSON, которые мы получили от этого HTTP-запроса).
Мы можем сделать все, что мы хотим с результатом в результате обратного вызова и, необязательно, мы можем вернуть некоторые NewResult
Отказ
Этот шаблон – хлеб и масло программирования с обещаниями, и именно поэтому люди считают, что это действительно все, с чем вы можете сделать с тогда
Отказ
Но тогда (SiC!) Приходит неловкий момент. Мы делаем HTTP-запрос, и мы хотим обрабатывать возможные ошибки из этого запроса, но у нас также есть случай, когда мы хотим бросить Ошибка, например, при проверке входящих JSON не удается:
httpRequest .then(jsonResult => { if (!isValid(jsonResult)) { throw new Error('This JSON is bad!'); } // if JSON is valid, simply do something with it });
На этом фрагменте, если JSON недействителен, мы бросим ошибку, которая будет размножаться дальше. Это то, что мы хотим.
Но и если есть какие-либо ошибки, приходящие непосредственно из httprequest.
они также будут распространяться. Это мы Не хочу. Мы хотим обрабатывать эти ошибки, но только те.
Так что было бы решением? Многие программисты, которые знают тогда
, знать также о поймать
метод. Итак, наверное, первая попытка будет выглядеть что-то подобное:
httpRequest .then(jsonResult => { if (!isValid(jsonResult)) { throw new Error('This JSON is bad!'); } // if JSON is valid, simply do something with it }) .catch(httpRequestError => { // handle somehow the HTTP request error });
Это, однако, не работает, как мы хотим.
Да, все ошибки из httprequest
будет пойман и обрабатываться, но и все ошибки, исходящие из наших тогда
Обратный вызов, включая ошибку проверки, также будет пойман!
И не только они будут пойманы, они также будут обрабатываться так же, как HTTP-ошибки, потому что наша поймать
Обратный вызов подготовлен только для этих видов исключения. Это может в свою очередь, привести к еще более неприятностям в функции обработки ошибок и привести к трудному отслеживанию ошибок.
Поэтому вторая мысль может быть, чтобы двигаться поймать
Метод выше Тогда способ:
httpRequest .catch(httpRequestError => { // handle somehow the HTTP request error }) .then(jsonResult => { if (!isValid(jsonResult)) { throw new Error('This JSON is bad!'); } // if JSON is valid, simply do something with it });
Это довольно тревожное решение, потому что в начале он будет кажется …| работать. Если HTTP-запрос разрешается правильно, тогда Метод будет называться как предполагаемый. Если проверка JSON не удается, ошибка будет брошена, и она не будет поймана любыми
поймать Как мы хотим.
Однако, если HTTP запрос не удается, поймать
Callback будет вызван. Что будет дальше, это то, что тогда
Метод будет называться сразу после!
Если мы ничего не вернем в нашу поймать
Обратный вызов, тогда
Обратный вызов позвонится с undefined
стоимость:
httpRequest .catch(httpRequestError => { // we are handling an error, but not // returning anything there }) .then(jsonResult => { // if `httpRequest` threw an error, // this callback will be called, // with `jsonResult` having value `undefined` });
Мы могли бы смягчить это, просто освобождение от выполнения тогда
Обратный вызов, когда его аргумент undefined
:
httpRequest .catch(httpRequestError => { // handle somehow the HTTP request error }) .then(jsonResult => { if (!jsonResult) { return; } if (!isValid(jsonResult)) { throw new Error('This JSON is bad!'); } // if JSON is valid, simply do something with it });
Это будет работать, но это все еще неловко и многолетнее. Мы просто не хотим вызывать обратный вызов JSON, когда у нас нет JSON, чтобы справиться! Так как мы это сделаем?
Именно там, где второй аргумент для тогда
поставляется с помощью. Второй аргумент тогда
Метод также является обратным вызовом, но это обратный вызов ошибки. Он будет вызван только тогда, когда некоторые обещания выше в цепочке вызовов бросают ошибку, которая не попадает и не обрабатывается раньше.
Итак, давайте переписаним наш пример:
httpRequest .then( jsonResult => { if (!isValid(jsonResult)) { throw new Error('This JSON is bad!'); } // if JSON is valid, simply do something with it }, httpRequestError => { // handle somehow the HTTP request error } );
Это очиститель , есть меньше кода, и нам не нужно делать никаких неловких undefined
проверки.
И, действительно, это работает так же, как мы хотим. Хитрость вот что функция обработки ошибок передана тогда
только реагирует на ошибки, которые происходят раньше в цепочке вызовов, а не ошибки, которые случаются в тогда
s первый обратный вызов.
Так что в этом примере все ошибки, поступающие из httprequest
Будут пойманы, но нашу ошибку валидации, происходящее в обратном вызове, не будет.
Кроме того, тогда
всегда будет вызывать только один из двух обратных вызовов. Если все пойдет вправо, он просто позвонит первым обратным вызовам, как обычно. Если в цепочке в цепочке есть необработанное исключение, он позвонит только второй обратный вызов.
Поэтому нам не нужно делать Если
S в первом обратном вызове. Если мы не получим правильный результат JSON из httprequest
Функция обработки JSON просто никогда не будет называться.
Ницца, не так ли?
Обратные вызовы по умолчанию тогда
Мы приближаемся к решению тайны поймать
Отказ
Чтобы наконец ответить на этот вопрос, нам нужно сделать только последний, ближе взглянул на аргументы, которые могут быть переданы в тогда
метод.
Мы уже показали, что тогда
Принимает второй необязательный аргумент. Но для вас может быть сюрприз, что первый аргумент тоже … необязательно!
Оказывается, что вы можете подумать обоих первых, так и вторых аргументов тогда
Как имеющие значения по умолчанию, которые будут использоваться, если вы не предоставите никакой функции.
Функция по умолчанию для первого аргумента:
result => result
И функция по умолчанию для второго аргумента:
error => throw error;
Это означает, что если вы не предоставляете первый аргумент для тогда
Этот метод будет просто принять ценность от предыдущего обещания и пройти его дальше.
С другой стороны, если предыдущее обещание бросает ошибку, функция обработки ошибок по умолчанию тогда
Будет просто возобновить эту ошибку.
Это очень разумное поведение по умолчанию, ведущее себя так интуитивно, что иногда программисты даже не думают об их существовании.
Решение тайны пойма
Со всеми этими знаниями мы на данный момент, когда мы можем поговорить больше о поймать
сам метод.
Это метод, который, как мы уже говорили, перейдите к способу обработки ошибок для большинства программистов JavaScript.
Но делайте те, которые используют это действительно понять, как это работает? В конце концов, похоже, что тогда
Метод уже встроен в обработку ошибок. Как в этом случае поймать
относится к тогда
?
Что вы должны думать о том, как поймать
ведет себя, когда обещание, к которому он привязан к не бросить ошибку:
const somePromiseWithCatch = Promise.resolve(5) .catch(error => console.log(error);
Если Обещание. Продвижение (5)
будет бросать ошибку, эта ошибка будет зарегистрирована на консоль.
Но это не так – Обещание. Продвижение (5)
немедленно разрешается на номер 5. Так какой результат мы получим в конце? Как улов будет вести себя здесь с обещанием, который не бросает никаких ошибок?
Давайте прикрепим тогда
к этому недавно построенному обещанию:
somePromiseWithCatch.then(value => console.log(value));
Как вы обязательно ожидали, после запуска этого кода номер 5 напечатан на консоли. Так что же поймать
Делает, это то, что он просто возвращает одинаковую ценность, что и предыдущее обещание, пока это обещание не бросило никакой ошибки.
Вся эта информация сейчас должна быть достаточно для решения тайны поймать
самостоятельно.
Что такое поймать
?
Это просто тогда
Метод без первого аргумента !!!
Действительно, два следующих примера работают точно так же!
somePromise.catch(error => { /* somehow handle the error */ });
somePromise.then(undefined, error => { /* somehow handle the error */ });
Обратите внимание, как мы прошли undefined
Как первый аргумент для тогда
Так что используется функция обратного вызова по умолчанию.
Мы могли бы также написать:
somePromise.then(result => result, error => { /* somehow handle the error */ });
который снова приведет к тому же поведению.
И если вы все еще не верьте мне, что это может быть так просто, просто посмотрите, как поймать
описан в стандарте Ecmascript:
Заключение
В этой статье мы решили «тайну» поймать
Отказ Мы показали, что это не полностью оригинальный метод, но просто крошечная обертка для тогда
Метод, который мы могли бы легко написать сами.
Очевидно, что это так удобно использовать, чтобы он был добавлен к родным обещаниям, чтобы сделать наш программирующий очиститель. Ведь легче поймать поймать
с вашим глазом среди многочисленных линий тогда
звонки.
Но по дороге мы видели, что иногда полезно использовать встроенный встроенный в тогда
Метод напрямую, потому что он может дать вам более тонкий настроенный элемент управления, в течение которых ошибки, которые вы хотите обрабатывать, и какие из них вы не можете.
Я надеюсь, что эта статья дала вам более глубокое понимание обоих поймать
и тогда
методы.
Если вам понравилось эту статью, считается следующим за мной на Twitter Где я регулярно публикую статьи на программировании JavaScript.
Спасибо за прочтение!
(Обложка Фото Кит Джонстон на Бессмысленно )
Оригинал: “https://dev.to/mpodlasin/solving-the-mystery-of-promise-catch-method-and-learning-more-about-the-then-on-the-way-1okl”