AngularJS - 烤面包机无法在 Controller 中工作

AngularJS - Toaster not working in Controller

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

您的代码似乎没问题。只要您重新抛出 $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绝对是首选。