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

时间:2016-12-24 15:14:38

标签: angularjs

这是模块

(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);
            });
        }

    }
    })();

我一直收到错误 - 无法读取属性'然后'当我在控制器中调用方法时,未定义 我之前使用过这种方式,它运作正常。

ANSWER

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')

缺少返回

4 个答案:

答案 0 :(得分:4)

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

假设test方法应该返回一个承诺。并返回undefined,这就是错误所说的内容。

应该是

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

  ...
}

答案 1 :(得分:1)

测试功能需要返回 $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

以前(版本< 1.6),来自承诺的onFulfilledonRejection处理程序的错误thrown也会传递给$exceptionHandler()(在除了以错误为理由拒绝承诺之外)。

要避免控制台中出现旧版本的错误消息,请通过返回被拒绝的承诺重新抛出:

  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);
  }

新手程序员的一个常见问题是被拒绝承诺错误转换以履行承诺。重要的是从拒绝处理程序中重新抛出错误。

当函数省略return statement时,该函数返回值undefined,错误地转换拒绝到已履行的承诺,该承诺解析为{{{ 1}}。

来自文档:

  

由于e13eea,承诺的undefinedonFulfilled处理程序抛出的错误与常规拒绝完全相同。以前,它也会被传递给onRejection(除了以错误为理由拒绝承诺)。

     

— AngularJS Developer Guide - Migrating to v1.6 ($q)

答案 2 :(得分:0)

不应该是:

$http.get('/test')
  .success(successFunction)
  .error(errorFunction);

至少,这是版本< 1.4.8

对于版本> 1.4.8试试这个:

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

答案 3 :(得分:0)

(function(){
    'use strict';

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

homeservice.$inject = ['$http']

function homeservice($http){
   return {
        test: function () {
            console.log("inside function");
            return $http.get('stats.json');
        }
    };
}
})();

<强> DEMO