JS链承诺结果总是解决

时间:2015-05-12 14:33:58

标签: javascript angularjs asynchronous promise

我仍然没有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
  • onlyGuest
  • 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访问应用程序,可以是访客,也可以记录in。

问题是当身份验证方法抛出reject()时,路由会自动触发changeError。所以对于这个customRoute(),我需要运行身份验证,但不要转到changeError - 即使authentication()promise拒绝,也总是解析为true。

不确定它是否更清晰,或者只是变得更复杂......

2 个答案:

答案 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;
    });
}