AngularJS Factory:undefined不是一个函数

时间:2015-01-31 18:25:54

标签: angularjs function resources undefined promise

我在AngularJS中编写了以下工厂服务,但是当我尝试在RootController中调用工厂服务时,我的控制台中出现了“undefined is a function”错误。

MyService.js:

(function() {
  angular.module('serviceTestApp')
    .factory('MyService', ['$resource', '$log', '$q', '$http', MyService]);

  function MyService($log, $resource, $http, $q) {
    var name = "Tom";

    var getName = function() {
      return name;
    }; //getName

    var changeName = function(newName) {
      name = newName;
    }; //changeName

    var getIP = function() {
      var deferredObj = $q.defer();
      $resource('http://jsonip.com').query().$promise.then(function(result) {
        deferredObj.resolve(result);
      }, function(errorMsg) {
        deferredObj.reject(errorMsg);
      });

      return deferredObj.promise;
    }; //getIP

    return {
      getName: getName,
      changeName: changeName,
      getIP: getIP
    };

  }

}());

在我的RootController中,我尝试调用服务,一切正常,直到我调用getIP()服务 - 返回一个promise对象。有没有人看错了什么?

RootController.js:

(function() {
  angular.module('serviceTestApp')
    .controller('RootCtrl', ['$http', '$log', '$scope', 'MyService', RootCtrl]);

  function RootCtrl($log, $scope, $http, MyService) {
    var vm = this;
    vm.message = "hello world from RootController";

    MyService.changeName("Henry Tudor");
    vm.message = "my name is: " + MyService.getName();

    MyService.getIP().query().then(function(data) {
      $log.info('in the promise, ip is: ' + data.ip);
      vm.message = vm.message + ', your IP is ' + data.ip;

    }, function(error) {
      vm.message = vm.message + ', error: ' + error;
    });

  }

}());

2 个答案:

答案 0 :(得分:1)

这可能听起来很愚蠢,但我找到了错误的原因:

$ resource()中使用的API返回一个JSON对象:

{"ip":"2601:0:b840:8077:a97f:ee9c:f5b8:1643","about":"/about","Pro!":"http://getjsonip.com"}

但是,query()需要一个数组,而不是JSON对象。 更改为另一个以JSON格式返回数组的API后,它可以正常工作。叹了口气,浪费了我2个小时。

谢谢大家

答案 1 :(得分:0)

为了使用您的服务

MyService.getName()

表示您拥有名为MyService的服务并返回名为getName

的函数

但在你的情况下,你不必改变 你回到那样的

 return {
      getName: function() {return getName();},
      changeName: function() {return changeName();},
      getIP: function() {return getIP();}
    };