对于如何实现承诺,我仍然不是100%坚定。
这是我要实现的目标:
我有一个解决或拒绝的诺言,代码会继续处理,如果诺言得到解决,它就会继续下去,如果被拒绝,它就会停止(不完全是,但对于这个问题来说足够好了)。现在的问题是,我只想兑现这一诺言,而不关心它是解决还是拒绝。
我以前拥有它的方式很简单:
function a(){
return Service.doSomething();
}
因此,我将其包装在其他承诺中,结果是:
function a(){
var q = $q.defer();
Service.doSomething(); // I don't even need to handle whatever the outcome is
q.resolve();
return q.promise;
}
(是,它是从角度项目中提取的)
现在,即使这个工作看起来也很难看。有什么更好/更好的方式可以写这个吗?
更新:
我确实意识到这看起来很奇怪,因此我将进一步解释。
这个例子是角度路由和我的定制中间件来处理身份验证。
因此,我创建了三个“路线”处理程序:
customRoute
来宾
onlyUser
所以不要写
$routeProvider.route({});
我写(例如)
$routeProvider.customRoute({});
现在,每个特殊的路由处理程序都通过身份验证扩展了路由的resolve属性。
这样,我可以做到这一点(例如):
$rootScope.$on('$routeChangeError',function(e, current, previous, rejection){
// Only for logged in users
if (rejection && rejection.needsAuthentication){
$rootScope.refUrl = $location.path();
$location.path('/user/login');
}
// Only for non-logged in users
if (rejection && rejection.isOnlyGuest){
$rootScope.refUrl = $location.path();
$location.path('/dashboard');
}
});
现在onlyGuest和onlyUser应该足够清楚,但是我还有customRoute(),如果用户直接通过此url直接访问应用程序并且既可以作为访客又可以登录,则该方法基本上运行身份验证方法只是为了检索用户信息。
问题是,当身份验证方法抛出reject()时,路由会自动触发changeError。因此,对于此customRoute(),我需要运行身份验证,但不要转到changeError-即使authentication()承诺被拒绝,也始终解析为true。
不知道它是否更清晰或更复杂...
最佳答案
因此,对于此customRoute(),我需要运行身份验证,但不要转到changeError-即使authentication()承诺被拒绝,也始终解析为true。
您似乎想使用catch
来忽略拒绝:
function customRoute() {
return authentication().catch(function(changeError) {
// ignore error
return true;
});
}