AngularJs错误无法读取属性';然后';未定义的

AngularJs错误无法读取属性';然后';未定义的,angularjs,Angularjs,这是模块 (function(){ /** * app Module * * Description */ angular.module('app',[]); })(); 我有这项服务 (function(){ 'use strict'; angular .module('app') .factory('homeservice',homeservice); homeservice.$inject = ['$http'

这是模块

(function(){

    /**
    * app Module
    *
    * Description
    */
    angular.module('app',[]);
})();
我有这项服务

(function(){
    'use strict';

angular
    .module('app')
    .factory('homeservice',homeservice);

homeservice.$inject = ['$http']

function homeservice($http){

    var service = {
        test : test
    }
    return service;

    /**
     * get articles
     * @return {[type]} [description]
     */
    function test(){
      $http.get('/test')
         .then(testSuccess)
         .catch(testError)

      function testSuccess(response){
         return response.data;
         //console.log(response.data) this line prints data to console
      }

      function testError(error){
         return error;
      }
    }
}
})();
这是我调用函数的控制器

(function(){


angular.module('app')
       .controller('HomeController',HomeController);

    HomeController.$inject = ['homeservice']
    function HomeController(homeservice) {
        var vm = this;

        test();

        function test(){
             homeservice.test().then(function(response){
                console.log(response);
            });
        }

    }
    })();
当我调用控制器中的方法时,我不断收到错误-无法读取未定义的的属性“then”。我以前用过这种方法,它工作正常

回答

function test(){
          return $http.get('/test') // return was missing here
             .then(testSuccess)
             .catch(testError)

          function testSuccess(response){
             return response.data;
             //console.log(response.data) this line prints data to console
          }

          function testError(error){
             return error;
          }
        }
我在$http.get('/test')处丢失了return

$http.get('/test')
  .success(successFunction)
  .error(errorFunction);
至少对于<1.4.8的版本来说是这样

对于>1.4.8的版本,请尝试以下操作:

$http.get('/test')
  .then(
    function(response) { }, // success
    function(response) { } // failure
  );

这个

homeservice.test().then(function(response){ ... });
假定
test
方法应该返回一个承诺。它返回
未定义的
,这就是错误所说的

应该是

/**
 * get articles
 * @return {[type]} [description]
 */
function test(){
  return $http.get('/test')
     .then(testSuccess)
     .catch(testError)

  ...
}

测试函数需要返回
$http
承诺:

function test(){
  ͟r͟e͟t͟u͟r͟n͟  $http.get('/test')
//^^^^^^ ---------------------RETURN the $http promise
     .then(testSuccess)
     .catch(testError)

  function testSuccess(response){
     return response.data;
  }

  function testError(error){
     ̶r̶e̶t̶u̶r̶n̶ ̶e̶r̶r̶o̶r̶;̶
     //throw to chain rejection
     throw error;
  }
}
成功和错误处理程序中的
return
语句不向父函数返回值。将
return
语句放在层次结构的每个级别


AngularJS旧版本的拒绝重新抛出
以前的版本(您是否定义了模块?@Sajeetharan是模块已定义,忘记添加它。我使用的是AngularJs版本1.6.0,但即使我尝试此操作,它也会引发另一个错误:$http.get(…).success不是一个函数。我将其更改为包含>1.4.8的语法,看看是否有任何更改。这并不能解决我的问题,因为我的逻辑是相同的。不,它不应该。早在1.4.8之前,
success
就被弃用了。当我从工厂发出console.log响应时,它会将数据输出到控制台。但控制器抛出错误。不确定您要执行的操作平均值。问题中的代码未命中
return
语句,这就是您得到
无法读取未定义的
错误的属性“then”的原因。如果您在应用此答案后继续得到错误,请提供一个plunk,以便问题可以被复制。
function test(){
  ͟r͟e͟t͟u͟r͟n͟  $http.get('/test')
//^^^^^^ ---------------------RETURN the $http promise
     .then(testSuccess)
     .catch(testError)

  function testSuccess(response){
     return response.data;
  }

  function testError(error){
     ̶r̶e̶t̶u̶r̶n̶ ̶e̶r̶r̶o̶r̶;̶
     //throw to chain rejection
     throw error;
  }
}
  function onRejection(error){
     ̶r̶e̶t̶u̶r̶n̶ ̶e̶r̶r̶o̶r̶;̶
     console.log(error.status);
     //throw to chain rejection
     return $q.reject(error);
  }