Ignorando a cadeia de promessas após lidar com erro

Usando ohttps://github.com/kriskowal/q biblioteca, gostaria de saber se é possível fazer algo assim:

// 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()
;

Basicamente, se os resultados do serviço forem ruins, eu gostaria de lidar com a falha no módulo A, usando uma lógica específica para as partes internas do módulo A, mas ainda pular as funções restantes do módulo B na cadeia de promessas.

A solução óbvia para ignorar as funções do módulo B é gerar um erro / razão do módulo A. No entanto, eu precisaria lidar com isso no módulo B. E, idealmente, eu gostaria de fazê-lo sem precisar de nenhum código extra no módulo B para este.

O que pode muito bem ser impossível :) Ou contra alguns princípios de design de Q.

Nesse caso, que tipo de alternativas você sugeriria?

Eu tenho duas abordagens em mente, mas ambas têm suas desvantagens:

Lance um erro específico do módulo A e adicione código de manipulação específico ao módulo B:

.fail(function(reason) {
  if (reason is specificError) {
    performVerySpecificErrorHandling();
  }
  else {
    // Handle the reason in a general way which is ok for module B functions
  }
})

Execute a manipulação de erro personalizada no módulo A e, após manipular o erro, lance um motivo falso de rejeição. No módulo B, adicione uma condição para ignorar o motivo falso:

.fail(function(reason) {
  if (reason is fakeReason) {
    // Skip handling
  }
  else {
    // Handle the reason in a general way which is ok for module B functions
  }
})

A solução 1 requer a adição de código específico do módulo A ao módulo B.

A solução 2 resolve isso, mas toda a abordagem de rejeição falsa parece muito imprudente.

Você pode recomendar outras soluções?

questionAnswers(3)

yourAnswerToTheQuestion