Encadenamiento de rechazos de promesa angular

Tengo una promesa encadenada y, en caso de rechazo de cualquiera de las promesas, necesito realizar una operación asincrónica (obtener el mensaje de error traducido). Como ya tengo una promesa encadenada sobre el éxito, supongo que no es posible encadenar también el rechazo: estoy tratando de anidar simplemente las llamadas asíncronas, pero no recibo la promesa resuelta dedeferred.reject(deferredRejection.promise); abajo. Punteros apreciados!

login: function(email, password) {
  var deferred = $q.defer();
  AuthService.login(email, password).then(function(response) {
    var user = {
      'accountToken': response.accountToken,
      'email': response.username,
      'onboarded': response.onboarded,
      'verified': response.verified
    };          
    return SyncStorageService.write(SyncStorageService.storageKeys.user, 
        user);  
  }, function(error) {
    // login failed
    var deferredRejection = $q.defer();
    $translate('ALERTS.LOGIN_FAILED').then(function(translatedValue) {
      deferredRejection.resolve(translatedValue);
    });
    deferred.reject(deferredRejection.promise);
  }).then(function(data) {
    deferred.resolve(data);
  }, function(error) {
    // saving data failed
    var deferredRejection = $q.defer();
    $translate('ALERTS.UNKNOWN').then(function(translatedValue) {
      deferredRejection.resolve(translatedValue);
    });
    deferred.reject(deferredRejection.promise);
  });
  return deferred.promise;
}

Solución actualizada:

Según la respuesta a continuación, pude volver a escribir el código de la siguiente manera:

login: function(email, password) {
  return AuthService.login(email, password).then(function(response) {
    return {
      'accountToken': response.accountToken,
      'email': response.username,
      'onboarded': response.onboarded,
      'verified': response.verified
    };
  }).then(function(data) {
    return SyncStorageService.write(SyncStorageService.storageKeys.user, 
        data);
  });
}

Notas:

AmbosAuthService.login ySyncStorageService.write ahora rechaza las promesas con unError objeto (p. ej.new Error('ALERT.ERROR_MESSAGE');), que burbujealogin al controlador (anteriormente estaba haciendo la traducción a nivel de servicio);El controlador que llama allogin el método tiene.then() y.catch() bloques - en un .catch (), el pasadoError.message se traduce y se muestra.

Respuestas a la pregunta(1)

Su respuesta a la pregunta