AngularJS承诺行为

时间:2015-03-10 20:04:19

标签: angularjs

我有一些使用angularJS的代码。 在我的应用程序初始化逻辑中,我一直在设置错误,但我无法弄清楚原因。 我认为这可能是承诺的问题。

这是我的控制器:

// TeacherCtrl.js
(function () {
    "use strict";

    angular
        .module("app.controllers")
        .controller("TeacherController", TeacherController)
        .config(["$routeProvider", config]);

    TeacherController.$inject = ["DataService"];

    function TeacherController(DataService) {
        var vm = this;
        vm.data = {};

        begin(7, 163000001);

        function begin(appId, schoolId) {
            DataService.GetData(appId, schoolId).then(function (data) {
                console.log(data);
            });
        }
    }

    function config($routeProvider) {
        $routeProvider
            .when("/teacher", {
                "templateUrl": "components/teacher/teacher.html"
                , "controller": "TeacherController"
                , "controllerAs": "vm"
            });
    }
})();

这是我的服务:

// app.services.js
(function () {
    "use strict";

    angular
        .module("app.services")
        .factory("DataService", ApplicationData);

    DataService.$inject = ["KeysResource"];

    function DataService(KeysResource) {
        return {
            "GetData": GetData
        };

        function GetData(appId, schoolId) {
            return KeysResource.load({
                "appId": appId,
                "schoolId": schoolId
            });
        }
    }
})();

这是我得到的错误:

 TypeError: undefined is not a function
at iniciar (http://my.url/TeacherCtrl.js:18:72)
at new TeacherController (http://my.url/TeacherCtrl.js:15:9)
at .. // angular js code here

它的外观是" .then"承诺的功能不是立即可用的。不应该是???

修改

这是我提到的KeysResource

"use strict";

(function () {
    var restClient = angular.module("restClient", ["ngResource"]);
    var serviceURL;

    restClient
        .factory("KeysResource", ["$resource", function ($resource)
            {
                serviceURL = "http://my.url/service/";

                return $resource(serviceURL, null, {
                    "load": {
                        "method": "get",
                        "url": serviceURL + "load"
                    }
                });
            }]);
})();

1 个答案:

答案 0 :(得分:1)

我发现了this类似问题的问题。

该解决方案与$ resource相关,后者不直接返回promise。如果我想使用$ resource的承诺,我也需要使用$ promise,就像那样:

    //TeacherCtrl.js
    function begin(appId, schoolId) {
        DataService.GetData(appId, schoolId).$promise.then(function (data) {
            console.log(data);
        });
    }