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.