Saltar la cadena de promesa después de manejar el error

Utilizando lahttps://github.com/kriskowal/q biblioteca, me pregunto si es posible hacer algo como esto:

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

Básicamente, si los resultados del servicio son malos, me gustaría manejar la falla en el módulo A, usando una lógica que sea específica para las partes internas del módulo A, pero aún omitir las funciones restantes del módulo B en la cadena de promesa.

La solución obvia para omitir las funciones del módulo B es arrojar un error / razón desde el módulo A. Sin embargo, tendría que manejar eso en el módulo B. E idealmente me gustaría hacerlo sin necesitar ningún código adicional en el módulo B para ese.

Lo cual puede ser imposible :) O contra algunos principios de diseño de Q.

En cuyo caso, ¿qué tipo de alternativas sugeriría?

Tengo dos enfoques en mente, pero ambos tienen sus desventajas:

Lanza un error específico desde el módulo A y agrega un código de manejo específico al 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
  }
})

Realice el manejo de errores personalizado en el módulo A, luego, después de manejar el error, arroje un motivo de rechazo falso. En el módulo B, agregue una condición para ignorar la razón falsa:

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

La solución 1 requiere agregar un código específico del módulo A al módulo B.

La solución 2 resuelve esto, pero todo el enfoque de rechazo falso parece muy hack.

¿Me puede recomendar otras soluciones?

Respuestas a la pregunta(3)

Su respuesta a la pregunta