javascript - JS链的 promise 和结果总是得到解决

标签 javascript angularjs asynchronous promise

对于如何链式 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/

相关文章:

javascript - 插入具有完整性和跨源属性问题的链接标签

c# - Javascript 显示 50 个文本框值的总和

javascript - 将 HTML 元素分隔成具有适当间距的列(JQuery 和 CSS)

javascript - $提供超过 1 个值以在描述中进行测试

javascript - Angular 工厂: how do I return a function that operates on $scope?

c++ - 异步 Qt 模型加载到 QML GridView

javascript - 如何使用运行 iOS6 的 iPad 调试 iPad iOS5 Javascript 错误?

javascript - Karma - 测试函数,不返回且不设置范围变量

firebase - flutter 异步验证表单

c# - 如何在不更改签名的情况下将同步方法转换为异步方法