我有一个链式承诺,如果其中一个承诺被拒绝,我需要执行异步操作(获取翻译后的错误消息)。由于我已经获得了成功的链接承诺,我认为不可能也链接拒绝 - 我试图简单地嵌套异步调用,但我没有从deferred.reject(deferredRejection.promise);
下面得到已解决的承诺。指点赞赏!
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;
}
更新的解决方案:
根据下面的答案,我能够重写代码如下:
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);
});
}
笔记:
- 两者
AuthService.login
和SyncStorageService.write
现在都拒绝带有Error
对象(例如new Error('ALERT.ERROR_MESSAGE');
)的承诺,该对象会冒泡login
到控制器(以前在服务级别进行翻译); - 调用该
login
方法的控制器具有.then()
和.catch()
阻塞 - 在 .catch() 上,传递Error.message
的内容被翻译和显示。