javascript - 调用服务返回未定义

标签 javascript angularjs angularjs-directive

我正在创建一个名为 ActiveUserProfileService 的服务,但是当我在 Controller 中调用它的函数时,我得到了 undefined 并且我无法弄清楚为什么。最奇怪的是,在 ActiveUserProfileService 服务中,来自 UserService 的信息是通过 console.log 显示的,所以我正在接收信息,但是在调用 code>ActiveUserProfileService 在 Controller 中,它给我 undifened。似乎数据没有传递。有人可以帮助我吗?

用户服务.js:

(function () {
    'use strict';

    angular
        .module('myApp')
        .factory('UserService', UserService);

    UserService.$inject = ['$http'];

    /* @ngInject */
    function UserService($http) {
        var service = {
            getAuthenticatedUser:         getAuthenticatedUser,
            getUserInformation:           getUserInformation

        };
        return service;

        function getUserInformation(idUser) {
            return $http.post('api/user/details', {idUser: idUser});
        }
        function getAuthenticatedUser() {
            return $http.get('api/user');
        }

    }

})();

ActiveUserProfileService.js

(function () {
    'use strict';

    angular
        .module('myApp')
        .factory('ActiveUserProfileService', ActiveUserProfileService);

    ActiveUserProfileService.$inject = ['$http','UserService'];

    /* @ngInject */
    function ActiveUserProfileService($http, UserService) {


        var service = {
            isAccount:            isAccount
        };
        return service;

        ////////////////

        function isAccount(accountName) {
            UserService.getAuthenticatedUser()
                .then(function (response) {
                    var data = response.data;

                    UserService.getUserInformation(data.user.id)
                        .then(function (response) {
                            var userDetails = response.data;
                            console.log("It is");
                            console.log(accountName == userDetails.account_types[0].description_internal);

                            return  accountName == userDetails.account_types[0].description_internal;
                        });
                })
        }

    }

})();

我的 Controller :

(function () {
    'use strict';

    angular
        .module('myApp')
        .controller('WizardController', WizardController);

    WizardController.$inject = [
        'UserService',

        'ActiveUserProfileService'

    ];

    /* @ngInject */
    function WizardController(UserService,ActiveUserProfileService) {

        var vm = this;


       console.log("ActiveUserProfileService");
    console.log(ActiveUserProfileService.isAccount("professional")); //is Returning me undefined



    }

})
();

最佳答案

重点是,您正试图在另一个回调函数中为 isAccount 返回一个值。当您这样做时,您将向此函数返回一个值,而不是 isAccount 本身,因此 isAccount 将不会返回任何未定义的内容。 由于您正在调用异步方法,因此 isAccount 也必须是异步的,

替换

 function isAccount(accountName) {
        UserService.getAuthenticatedUser()
            .then(function (response) {
                var data = response.data;

                UserService.getUserInformation(data.user.id)
                    .then(function (response) {
                        var userDetails = response.data;
                        console.log("It is");
                        console.log(accountName == userDetails.account_types[0].description_internal);

                        return  accountName == userDetails.account_types[0].description_internal;
                    });
            })
    }

 function isAccount(accountName) {
    var deferred = $q.defer();
        UserService.getAuthenticatedUser()
            .then(function (response) {
                var data = response.data;
                //when the user is loaded, then you resolve the promise you has already returned
                UserService.getUserInformation(data.user.id)
                    .then(function (response) {
                        var userDetails = response.data;
                        console.log("It is");
                        console.log(accountName == userDetails.account_types[0].description_internal);
                        deferred.resolve(accountName == userDetails.account_types[0].description_internal);
                        return; //here is not isAccount return, but anonymous inner function 'function (response)', you got it?
                    });
            });
    return deferred.promise; //return as soon as creates the promise
}

当然你也必须注入(inject) $q 服务

关于javascript - 调用服务返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484098/

相关文章:

javascript - 使用kafka消费者进行数据库操作或http调用

javascript - 如何使用ngdialog在angularjs中实现重定向之前的消息?

javascript - ASP.NET 中动态生成的 Canvas 元素

javascript - 在 webhook 端点中执行 Javascript

javascript - html页面找不到 Angular

angularjs - Excel 文件下载 无法使用 exceljs 在 node.js 中工作

css - 指令容器的高度为 0px,宽度为 0px - angularjs

javascript - 为什么没有为指令中的 ng-options 设置空白选项

javascript - 验证在 bootstrap html 中不起作用

javascript - 如何将 JPEG 从 URL 保存到 angularjs(ionic) 中的文件?