Javascript JS链承诺与结果总是解决

Javascript JS链承诺与结果总是解决,javascript,angularjs,asynchronous,promise,Javascript,Angularjs,Asynchronous,Promise,我还没有100%确定如何兑现承诺。 以下是我努力实现的目标: 我有一个承诺会被解决或拒绝,代码会进一步处理这个问题,如果承诺被解决,它会继续,如果被拒绝,它会停止(不完全是这样,但对于这个问题来说已经足够好了)。现在的问题是,我只想履行这个承诺,而不管它是解决还是拒绝 我以前的做法很简单: function a(){ return Service.doSomething(); } 因此,我将其包装在其他承诺中,结果是: function a(){ var q = $q.defe

我还没有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;
}
(是的,它取自角度项目)

现在即使这样,它看起来还是很难看。有没有更好/更好的写作方法

更新: 我确实意识到这看起来很奇怪,所以我将进一步解释

这个例子是angular routes和我处理身份验证的自定义中间件的示例

因此,我创建了三个“路由”处理程序:

  • 海关路线
  • 唯一的
  • 独行者
因此,与其写作

$routeProvider.route({});
我写(例如)

现在,每个特殊的路由处理程序都通过身份验证扩展了路由的resolve属性

这样我就可以做到这一点(例如):

现在,onlyGuest和onlyUser应该足够清楚了,但我还有customRoute(),它基本上运行身份验证方法,只要用户通过此url直接访问应用程序,就可以检索用户信息,并且可以是来宾,也可以登录

问题是,当身份验证方法抛出reject()时,路由会自动激发changeError。因此,对于这个customRoute(),我需要运行身份验证,但不要转到changeError-始终解析为true,即使身份验证()承诺拒绝

不知道是更清楚还是更复杂

function a() {
    return Service.doSomething().then(angular.noop, angular.noop);
}
会发生什么?如果将函数作为错误回调传递给
then()
,并且该函数未返回
$q.reject(…)
,则
then()
返回的承诺将得到解决,而不是被拒绝

看一把小小提琴:

但是请注意,根据@newdev的评论,您试图实现的目标似乎很奇怪

因此,对于这个customRoute(),我需要运行身份验证,但不要转到changeError-始终解析为true,即使身份验证()承诺拒绝

您似乎希望使用来忽略拒绝:

function customRoute() {
    return authentication().catch(function(changeError) {
        // ignore error
        return true;
    });
}

我想是服务。doSomething()是第一个承诺。如果是这样的话,那么你就不会把它包装在另一个承诺中。你在一个函数中有另一个承诺。也不清楚1-你想做什么,2-你的问题是什么。@Tom。。。你以前的想法是正确的。你为什么决定改变它?如果是这样的话,你想达到什么目的?@NewDev好的,我会用更多的细节更新这个问题-一minute@Tom,然后,实际上,您需要处理错误情况,正如下面的答案所示,除了,我认为它应该是
。然后(function(data){return data;},angular.noop)
-这样,如果成功,实际数据已解析。@NewDev所以您认为在agular路径中,我应该只返回值而不是承诺?我认为应该是
。然后(函数(数据){return data;},angular.noop)
我希望我能接受两个答案,您的答案和接受的答案解决了问题,我只是认为使用catch()更优雅一点。如果有任何缺点,请让我知道@NewDev我试着用noop来做这两件作品都很好,还有希腊司法部长Nikos Paraskevopoulos?Tom,两者都很好。我也更喜欢
.catch
function a() {
    return Service.doSomething().then(angular.noop, angular.noop);
}
function customRoute() {
    return authentication().catch(function(changeError) {
        // ignore error
        return true;
    });
}