Пропуск цепочки обещаний после обработки ошибки

С использованием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 решает эту проблему, но весь подход к поддельному отказу кажется очень хакерским.

Можете ли вы порекомендовать другие решения?

Ответы на вопрос(3)

Ваш ответ на вопрос