Javascript 返回未定义值的工厂方法

Javascript 返回未定义值的工厂方法,javascript,angularjs,Javascript,Angularjs,我使用工厂配方从控制器调用方法,这里是工厂定义 app.factory('AccountService', function ($http){ var factory = {}; factory.getAuthenticate = function (credentials) { $http({ method: 'post', url: '/api/login', data: credent

我使用工厂配方从控制器调用方法,这里是工厂定义

app.factory('AccountService', function ($http){
    var factory = {};

    factory.getAuthenticate = function (credentials) {
        $http({
            method: 'post',
            url: '/api/login',
            data: credentials
        }).success(function (data, status, headers, config){
            return true;
        }).error(function (data, status, headers, config){
            return false;
        });
    }

    return factory;
});
当我从一个控制器调用getAuthenticate方法时

app.controller('DefaultController', function ($scope, $location, AccountService){
    $scope.login = function(){
        alert(AccountService.getAuthenticate($scope.credentials));
        // if(AccountService.getAuthenticate($scope.credentials)) {
        //     $location.path('/dashboard');
        // }
    }
});

它总是根据http调用返回undefined,而不是true或false。知道我遗漏了什么吗?

$http方法会自动返回一个承诺。因此,您必须在控制器中处理此问题。您的代码应如下所示:

    app.factory('AccountService', function ($http){
        var factory = {};

        factory.getAuthenticate = function (credentials) {
            return $http({
                method: 'post',
                url: '/api/login',
                data: credentials
            });
        };

        return factory;
    });



app.controller('DefaultController', function ($scope, $location, AccountService){
    $scope.login = function(){
        AccountService.getAuthenticate($scope.credentials)
            .success(function (response) {
                alert('Everything went better than expected :)');
                $location.path('/dashboard');
            })
           .error(function (error) {
                alert(error);

            });
    };
});

你的函数在一秒钟内不会返回任何东西,你正在进行asyc调用,因此你的函数将在ajax请求完成之前返回。正如Patrick所说,异步函数不会返回这样的值,要么返回承诺,要么使用回调。回调应该从控制器中抽象出来并放入工厂。您应该仅在使用该服务拨打电话后在控制器内部进行数据绑定。