我仍然没有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;
}
(是的,它来自角度项目)
现在即使这样做也只是看起来很难看。有没有更好/更好的方式我可以写这个?
更新 我确实意识到这看起来很奇怪,所以我要解释一下。
此示例是角度路由和我的自定义中间件来处理身份验证。
所以我创造了三个"路线"处理程序:
所以不要写
$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访问应用程序,可以是访客,也可以记录in。
问题是当身份验证方法抛出reject()时,路由会自动触发changeError。所以对于这个customRoute(),我需要运行身份验证,但不要转到changeError - 即使authentication()promise拒绝,也总是解析为true。
不确定它是否更清晰,或者只是变得更复杂......
答案 0 :(得分:1)
function a() {
return Service.doSomething().then(angular.noop, angular.noop);
}
会发生什么?如果您将函数作为错误回调传递给then()
并且函数 NOT 返回$q.reject(...)
,则then()
返回的承诺已解决< / em>,而不是被拒绝。
看一点小提琴:http://jsfiddle.net/u6kzo1o0/
但是请注意,根据@New Dev。
的评论,你想要达到的目标看起来很奇怪答案 1 :(得分:1)
因此对于这个customRoute(),我需要运行身份验证,但不要转到changeError - 即使authentication()promise拒绝,也总是将其解析为true。
您似乎想要使用catch
来忽略拒绝:
function customRoute() {
return authentication().catch(function(changeError) {
// ignore error
return true;
});
}