Angular服务返回undefined

时间:2015-12-14 15:53:16

标签: javascript angularjs promise angular-services

我的角色服务有问题。

我的服务有下一个代码:

app.service("Utilidades", ['$http', '$window', function ($http, $window) {
return {
    Get: function (urlAbsoluta, parametros, callback) {
        var Utilidades = this;

        $http
            .get(app.UrlBase + urlAbsoluta, parametros)
            .then(function (data) {
                var Datos = angular.fromJson(data);

                Utilidades.GuardarToken(Datos.Token);

                callback(Datos);
            });
    },


    ObtenerMenu: function () {
        var Utilidades = this;

        Utilidades.Get("Administracion/Api/Usuarios/Menu", {}, function (Datos) {
            Datos = angular.fromJson(Datos.data);

            if (Datos.Error == "") {
                return Datos.Resultado;
            } else {
                return "";
            }
        });
    }
}
}]);

然后,在我的控制器中,我有下一个代码:

app.controller('LoginCtrl', ['$scope', '$http', '$location', 'Utilidades',
function Iniciador($scope, $http, $location, Utilidades) {
        var Li = this;

        Li.Usuario = "";
        Li.Contrasena = "";
        Li.Error = "";
        Li.MenuItems = [];

        Li.Menu = function () {
            Li. MenuItems = Utilidades.ObtenerMenu();
        }
    }]
);

当我运行时,Li.MenuItems有未定义的值,我不知道为什么。

2 个答案:

答案 0 :(得分:5)

您的return语句位于内部ObtenerMenu方法中,因此ObtenerMenu方法实际上并未返回任何内容。您需要提供一种访问结果值的方法:

<强>服务

app.service("Utilidades", ['$http', '$window', function ($http, $window) {
    return {
        Get: function (urlAbsoluta, parametros) {
            var Utilidades = this;

            // v------------  return statement here
            return $http
                .get(app.UrlBase + urlAbsoluta, parametros)
                .then(function (data) {
                    var Datos = angular.fromJson(data);

                    Utilidades.GuardarToken(Datos.Token);

                    // v------------  return statement here
                    return Datos;
                });
        },


        ObtenerMenu: function () {
            var Utilidades = this;

            // v------------  return statement here
            return Utilidades.Get("Administracion/Api/Usuarios/Menu", {})
                .then(function (Datos) {
                    if (Datos.Error == "") {
                        return Datos.Resultado;
                    } else {
                        return "";
                    }
                });
        }
    };
}]);

在控制器中

Li.Menu = function () {
    Utilidades.ObtenerMenu()
        .then(function (resultado) {
             Li. MenuItems = resultado;
        });
}

答案 1 :(得分:0)

因为ObtenerMenu函数是异步函数。这个函数最初没有返回任何东西(所以未定义),之后,当ajax请求完成后,这个函数已经完成了它的执行堆栈