Скажем, у меня есть 4 функции: runA()
, runB()
, runC()
и runD()
.
Используя обещания ES6, при полностью успешном запуске все они будут выполняться одно за другим:
runA()
.then(runB)
.then(runC)
.then(runD)
Если runA
или runB
терпят неудачу (отклоняют или бросают), я хотел бы вызвать error1()
, а затем полностью остановить цепочку (не вызывать runC
или runD
). Это заставляет меня думать, что я должен добавить один .catch()
в самый конец цепочки обещаний .then
:
runA()
.then(runB)
.then(runC) //won't get called if runA or runB throws
.then(runD) //won't get called if runA or runB throws
.catch(error1)
Но если runC
терпит неудачу, я хотел бы вызвать error2()
и все же остановить цепочку (не вызывать runD
).
runA()
.then(runB)
.catch(error1) //moved up to only handle runA and runB
.then(runC) //but now this gets called after error1() is run
.then(runD)
.catch(error2)
Теперь, когда у меня есть 2 вызова catch
в цепочке, runC
будет вызываться после запуска error1
, поскольку результатом перехвата по умолчанию будет resolve
. Является ли мой единственный вариант, чтобы функция error1
создавала обещание, которое она всегда отклоняет?
.catch()
? Вы можете выполнить сортировку ошибок в обратном вызове catch (if (error1) error1() else if (error2) error2()...
). Выбрасываемый вами объектError
может иметь сообщение и имя (может быть нужного вам типа, например «RunCError»). - person Shanoor   schedule 24.12.2015runA() .then(runB) .then(runC) .then(runD)
- ... кроме этого, если вы действительно не можете определить, что вызвало ошибку, вы можетеthrow
в концеerror1
пропустить мимоrunC
иrunD
- но вы' Мне нужно определить вerror2
, что ошибка возникла из A или B, а не C или D в любом случае - person Jaromanda X   schedule 24.12.2015