Javascript 爱奥尼亚控制器和服务:“;类型错误:。。。不是一个函数;

Javascript 爱奥尼亚控制器和服务:“;类型错误:。。。不是一个函数;,javascript,cordova,ionic,Javascript,Cordova,Ionic,我正在开发一款爱奥尼亚的移动应用程序,却被错误缠住了 TypeError:t.getCases(…)。then不是函数 以下是我的控制器和相关服务: 服务 控制器 请注意,在构建包文件之前,我运行gulp脚本来合并和“uglify”所有JS文件 如有任何帮助,我们将不胜感激。如前所述,为了使用“then”(异步调用),您必须从服务返回一个承诺,以便能够在之后获取控制器: starter.services.factory('appData', function($q) { return {

我正在开发一款爱奥尼亚的移动应用程序,却被错误缠住了

TypeError:t.getCases(…)。then不是函数

以下是我的控制器和相关服务:

服务 控制器 请注意,在构建包文件之前,我运行gulp脚本来合并和“uglify”所有JS文件

如有任何帮助,我们将不胜感激。

如前所述,为了使用“then”(异步调用),您必须从服务返回一个承诺,以便能够在之后获取控制器:

starter.services.factory('appData', function($q) {

  return {
      getCases: function() {

        var deferred = $q.defer();

        var cases =[ 
          {case_id: 1, description: 'headache'},
          {case_id: 2, description: 'fever'},
          {case_id: 3, description: 'stomachache'}
        ];

        //attach data to deferred object
        deferred.resolve(cases);

       //return promise to be catched with "then"
       return deferred.promise;

    }
  } 

})
如果您可能希望将错误作为回调返回,则可以通过调用deferred.reject(error)(而error是可选的错误消息/对象)来拒绝承诺

下面是另一个很好的链接,它帮助我理解了异步编程的概念,并在angular中给出了承诺:

我对Angular几乎一无所知,但仅从错误消息来看,似乎很有可能无论您向
getCases
提供什么,都希望它返回一个承诺,而不是一个简单的对象。@T.J.Crowder,是的,您是对的,只要工厂返回一个承诺,一切都会像一个符咒一样工作!:D感谢您的帮助,但如果工厂仅返回deferred.resolve,则在控制器端会出现另一个错误“TypeError:无法读取未定义的属性'then'。问题得到解决,直到工厂返回deferred.promise。当然,您必须返回延迟对象的承诺。不知怎的,一些代码丢失了。。。。我相应地更新了我的答案。谢谢你的解决方案。我有服务,我试图从不同的控制器调用,但我第一次获取的问题,它的工作正常。另一次尝试调用give me“TypeError:object不是函数”,如果您能给我一种解决方案,我将不胜感激。
starter.controllers.controller('mainViewCtrl', function($scope, appData) {

  appData.getCases().then(function(data){
      $scope.cases = data.cases;
   });  

  console.log("mainViewCtrl completed");
})
starter.services.factory('appData', function($q) {

  return {
      getCases: function() {

        var deferred = $q.defer();

        var cases =[ 
          {case_id: 1, description: 'headache'},
          {case_id: 2, description: 'fever'},
          {case_id: 3, description: 'stomachache'}
        ];

        //attach data to deferred object
        deferred.resolve(cases);

       //return promise to be catched with "then"
       return deferred.promise;

    }
  } 

})