Использование Promise включает в себя несколько неоптимальных шаблонов.Их исправление фактически приводит к тому, чего вы пытаетесь достичь.
textProcess.then(data => {
// 1st anti-pattern fix
// any error triggered here
// also gets caught at the end catch
return JSON.parse(data)
}).then(json => {
// work on json obj
}).catch(e => {
// 2nd anti-pattern fix
// one catch for the whole thenable chain
console.error("Failed to parse!", e)
})
Таким образом, вы правильно используете то, что предлагает Javascript Promise, и один простой .catch
для того, что вам нужно.
Редактировать - некоторые пояснения по задействованным анти-шаблонам Promise
Отмеченный 1st anti-pattern
относится к ненужному вложенному блоку try..catch
внутри then
.Внутри него вы можете синхронно возвратить (даже undefined
) другое обещание (оба thenable
) или выдать ошибку (которая может быть поймана catch
).По сути, вам не нужно явно перехватывать его, но пусть он «течет» сквозь него.
2nd anti-pattern
Как уже упоминалось, тот факт, что второй параметр - обработчик отклонения then
считается субоптимальнымв большинстве случаев использования.Цепочка Promise должна использовать одну catch
, чтобы упростить рабочий процесс.
Однако в редких случаях, когда необходимо выполнить «ранний поиск» и «возобновление», рассмотрите следующий способ, который все ещебит яснее, чем использование двух обработчиков для then
:
textProcess.then(data => {
return parser1(data)
}).catch(e => {
console.log("First parser failed")
// for example first parser failed
return "fallback data"
}).then(data => {
// process received data as "fallback data"
}).catch(e => {
// always have a "last resort" catch at the end of the workflow
})