AngularJS - Toaster无法在Controller中运行

时间:2016-11-05 09:18:31

标签: javascript angularjs angular-promise angularjs-http

Service.js

this.userLogin = function (username, password) {

        var dataBody = $.param({'username': username,'password': password});
        return $http({
            method: 'POST',
            url: servicePathURL,
            data: dataBody,
            headers: {
                "Authorization": "Basic",
                "Content-Type": "application/x-www-form-urlencoded"
            }
        })

        .then(function (response) {
            $rootScope.globals = {
                currentUser: {
                    username: username,
                }
            };
            return response;

        }).catch(function (error) {
            throw error;
        });
    };

Controller.js

AuthenticationServiceLogin.userLogin($scope.username, $scope.password)

            .then(function (response) {

                if (response.status ==200) {   
                    toaster.pop('success', "", "Login Successful");
                    $location.path('/home');
                }

            }).catch(function (error) {
                toaster.pop('error', "", error.statusText);
        });
  1. 在Controller.js中,当用户登录时出现异常时,未调用toaster.pop('error', "", error.statusText);
  2. 我也使用过$http方法,返回有什么好处 $q.defer()承诺而不是$http承诺或被视为最佳做法?如果是,我如何将上述$http代码修改为promise

1 个答案:

答案 0 :(得分:0)

您的代码似乎没问题。只要您重新抛出$http调用遇到的任何错误,他们应该一直传播到控制器。我倾向于说你的错误处理的任何问题都不在你发布的代码中。

如果你不打算对抛出的错误做任何工作,那么在service.js中有一个catch处理程序是没有优势的。 Service.js看起来像这样:

<强> Service.js

this.userLogin = function (username, password) {
    return $http({
        method: 'POST',
        url: servicePathURL,
        data: $.param({'username': username,'password': password}),
        headers: {
            "Authorization": "Basic",
            "Content-Type": "application/x-www-form-urlencoded"
        }
    })
    .then(function (response) {
        $rootScope.globals = {
            currentUser: {
                username: username,
            }
        };
        return response;
    // The catch block here is useless. The promise returned by $http will transmit any
    // errors on its own.        
    //}).catch(function (error) { 
    //    throw error;
    });
};

回答你的第二个问题:使用$q.defer()而不是返回$http本身返回的承诺没有任何好处,还有一些主要的缺点 - 即登录引发的任何异常方法会消失。有关详细信息,请参阅此处的延迟反模式:https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns

$http绝对是首选。