Пропуск цепочки обещаний после обработки ошибки
С использованиемhttps://github.com/kriskowal/q библиотека, мне интересно, возможно ли сделать что-то вроде этого:
// Module A
function moduleA_exportedFunction() {
return promiseReturningService().then(function(serviceResults) {
if (serviceResults.areGood) {
// We can continue with the rest of the promise chain
}
else {
performVerySpecificErrorHandling();
// We want to skip the rest of the promise chain
}
});
}
// Module B
moduleA_exportedFunction()
.then(moduleB_function)
.then(moduleB_anotherFunction)
.fail(function(reason) {
// Handle the reason in a general way which is ok for module B functions
})
.done()
;
В основном, если результаты обслуживания плохие, я бы хотел обработать сбой в модуле A, используя логику, специфичную для внутренних компонентов модуля A, но все же пропустить оставшиеся функции модуля B в цепочке обещаний.
Очевидное решение для пропуска функций модуля B состоит в том, чтобы выбросить ошибку / причину из модуля A. Однако тогда мне нужно было бы обработать это в модуле B. И в идеале я хотел бы сделать это без необходимости какого-либо дополнительного кода в модуле B для тот.
Что вполне может быть невозможно :) Или против некоторых принципов проектирования Q.
В каком случае, какие альтернативы вы бы предложили?
Я имею в виду два подхода, но оба имеют свои недостатки:
Выдать конкретную ошибку из модуля A и добавить специальный код обработки в модуль B:
.fail(function(reason) {
if (reason is specificError) {
performVerySpecificErrorHandling();
}
else {
// Handle the reason in a general way which is ok for module B functions
}
})
Выполните пользовательскую обработку ошибок в модуле A, затем, после обработки ошибки, выведите ложную причину отклонения. В модуле B добавьте условие, чтобы игнорировать ложную причину:
.fail(function(reason) {
if (reason is fakeReason) {
// Skip handling
}
else {
// Handle the reason in a general way which is ok for module B functions
}
})
Решение 1 требует добавления специального кода модуля A в модуль B.
Решение 2 решает эту проблему, но весь подход к поддельному отказу кажется очень хакерским.
Можете ли вы порекомендовать другие решения?