对于如何链式 promise ,我仍然不是 100% 扎实。 这是我想要实现的目标:
我有一个解决或拒绝的 promise ,代码进一步拾取这一点,如果 promise 得到解决,它就会继续,如果被拒绝,它就会停止(不完全是,但对于这个问题来说已经足够好了)。现在的问题是我只想运行这个 promise ,而不关心它是否解决或拒绝。
我以前的方式很简单:
function a(){
return Service.doSomething();
}
所以我把它包装在其他 promise 中,结果是:
function a(){
var q = $q.defer();
Service.doSomething(); // I don't even need to handle whatever the outcome is
q.resolve();
return q.promise;
}
(是的,它取自 Angular 项目)
尽管这可行,但看起来还是相当难看。有没有更好/更好的方法可以写这个?
更新: 我确实意识到这看起来很奇怪,所以我将进一步解释一下。
这个示例是 Angular 路由和我的自定义中间件来处理身份验证。
所以我创建了三个“路由”处理程序:
- 自定义路由
- 仅限客人
- 仅限用户
所以而不是写
$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() promise 拒绝,也始终解析为true。
不确定它是否更清晰还是变得更复杂......
最佳答案
So for this customRoute() I need to run the authentication but not go to changeError - always resolve as true even if authentication() promise rejects.
您似乎想使用catch
忽略拒绝:
function customRoute() {
return authentication().catch(function(changeError) {
// ignore error
return true;
});
}
关于javascript - JS链的 promise 和结果总是得到解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194008/