【问题标题】:AngularJS handle rejected response with UI-RouterAngularJS 使用 UI-Router 处理被拒绝的响应
【发布时间】:2014-07-15 15:37:38
【问题描述】:

我有一个服务,它将我的 API 调用包装在 Angular 中:

var ConcernService = {

    list: function (items_url) {
        var defer = $q.defer();
        $http({method: 'GET', 
            url: api_url + items_url})
            .success(function (data, status, headers, config) {
                defer.resolve(data, status);
            })
            .error(function (data, status, headers, config) {
                defer.reject(data, status);
            });
        return defer.promise;
    },

然后是我的应用配置,UI-Router:

    .config(function($stateProvider){

        $stateProvider

        .state('default', {
            url: '/',
            resolve: {
                tasks: function ($stateParams, ConcernService) {
                    return ConcernService.list('tasks/').then(
                        function (tasks)   { return tasks; },
                        function (reason)  { return []; }
                    );
                },
                ...
            }
        }
    });

这是我可以使用的最基本的配置,如果遇到403404 等,它基本上只是返回一个空对象,我可以在视图模板中处理它。

我的问题是,将其他细节添加到视图/模板的最佳方法是什么,例如拒绝 reasonstatus。它应该在tasks 对象中返回,还是单独返回?

【问题讨论】:

    标签: angularjs promise angular-ui-router


    【解决方案1】:

    嗯,首先,你的第一段代码有deferred anti pattern,让我们来解决这个问题:

    list: function (items_url) {
        return $http.get(api_url + items_url); // $http already returns a promise
    },
    

    另请注意,延迟拒绝和履行是单一值,因此您的多个返回值在这里并不真正起作用。

    现在,让我们看看路由器。首先,您的第一个履行处理程序是多余的。

    .state('default', {
            url: '/',
            resolve: {
                tasks: function ($stateParams, ConcernService) {
                    return ConcernService.list('tasks/'); // result.data contains the data here
                },
                ...
            }
    

    现在,我们遇到的问题是如果被拒绝会发生什么?

    好吧,听听$stateChangeError

    $rootScope.$on('$stateChangeError', 
    function(event, toState, toParams, fromState, fromParams, error){ ... })
    

    在这里,您可以收听因拒绝而导致的更改状态失败。

    【讨论】:

    • 嘿 Benjamin - 感谢您对我的代码的指点。我确实认为它有点啰嗦。我现在确实更好地理解了承诺。至于状态更改错误表达式 - 这应该放在我的app.config 中吗?然后将各种错误映射到我想要的状态?
    • 对。实施工作。作为记录,我将stateChangeError 语句添加到app.run(),我可以将错误对象传递给通用部分模板以显示特定于上下文的消息。谢谢!
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2016-04-02
    • 2019-11-25
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多