Скажем, у нас есть 3 асинхронных задачи, которые возвращают Promises: A
, B
и C
. Мы хотим связать их вместе (т.е. Для ясности, принимая значение, возвращаемое A
и вызывая B
с ним), но также хотим правильно обрабатывать ошибки для каждого и выходить из строя при первом сбое, В настоящее время я вижу два способа сделать это:
A
.then(passA)
.then(B)
.then(passB)
.then(C)
.then(passC)
.catch(failAll)
Здесь функции passX
обрабатывают каждый успешный вызов X
. Но в функции failAll
нам пришлось бы обрабатывать все ошибки A
, B
и C
, которые могут быть сложными и непростыми для чтения, особенно если у нас было более 3 асинхронных задач, Таким образом, другой подход учитывает это:
A
.then(passA, failA)
.then(B)
.then(passB, failB)
.then(C)
.then(passC, failC)
.catch(failAll)
Здесь мы выделили логику исходного failAll
в failA
, failB
и failC
, что кажется простым и читаемым, поскольку все ошибки обрабатываются прямо рядом с его источником. Однако это не делает то, что я хочу.
Посмотрим, не сработает ли A
(отклонено), failA
не должен переходить на вызов B
, поэтому он должен выбросить исключение или отклонить вызов. Но оба они попадают под failB
и failC
, что означает, что failB
и failC
должны знать, были ли мы уже сработали или нет, предположительно, сохраняя состояние (т.е. переменную).
Более того, кажется, что чем больше задач async у нас есть, тем больше наша функция failAll
растет (путь 1), или больше функций failX
вызывается (путь 2). Это подводит меня к моему вопросу:
Есть ли лучший способ сделать это?
Рассмотрение. Поскольку исключения из then
обрабатываются методом отклонения, должен ли существо быть метод Promise.throw
, чтобы фактически отключить цепочку?
A возможно дублировать, с ответом, который добавляет больше областей внутри обработчиков. Разве promises не выполняет функции линейной цепочки функций, а не передает функции, которые передают функции, которые передают функции?