对于如何实现承诺,我仍然不是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;
    });
}

07-26 02:30