Chaining Angular Versprechen Ablehnungen
Ich habe ein angekettetes Versprechen und muss im Falle einer Ablehnung eines der Versprechen eine asynchrone Operation ausführen (übersetzte Fehlermeldung abrufen). Da ich bereits ein angekettetes Erfolgsversprechen habe, gehe ich davon aus, dass es nicht möglich ist, auch bei Ablehnung zu ketten. Ich versuche, die asynchronen Aufrufe einfach zu verschachteln, erhalte aber nicht das aufgelöste Versprechen von @ zurücdeferred.reject(deferredRejection.promise);
unten. Hinweise erwünscht!
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;
}
Aktualisierte Lösung:
Auf der Grundlage der folgenden Antwort konnte ich den Code wie folgt umschreiben:
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);
});
}
Anmerkungen
BeideAuthService.login
undSyncStorageService.write
lehne jetzt Versprechen mit einem @ Error
Objekt (z. B.new Error('ALERT.ERROR_MESSAGE');
), die durch @ sprudelogin
an den Controller (hat zuvor die Übersetzung auf Service-Ebene durchgeführt);Der Controller, der das @ aufrulogin
Methode hat.then()
und.catch()
blocks - bei einem .catch () wird das übergebeneError.message
wird übersetzt und angezeigt.