离子控制器和服务:“类型错误:...不是函数”

Won*_*mmy 5 javascript cordova ionic

我正在开发 Ionic 的移动应用程序并被错误卡住

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

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

服务

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

  return {
      getCases: function() {

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

        return cases;
    }
  } 

})
Run Code Online (Sandbox Code Playgroud)

控制器

starter.controllers.controller('mainViewCtrl', function($scope, appData) {

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

  console.log("mainViewCtrl completed");
})
Run Code Online (Sandbox Code Playgroud)

请注意,在构建包文件之前,我运行 gulp 脚本来合并和“丑化”所有 JS 文件。

任何帮助将非常感激。

nic*_*ost 1

正如TJ Crowder所说,为了使用“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;

    }
  } 

})
Run Code Online (Sandbox Code Playgroud)

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

这是另一个很好的链接,它帮助我了解了角度承诺的异步编程的概念: $q.defer