2016-12-24 70 views
2

这是模块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); 
      }); 
     } 

    } 
    })(); 

我一直出现错误 - 无法读取未定义的属性'then'当我在我的控制器中调用方法。我以前使用过这种方式,它工作正常。

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( '/测试')回报

+0

做你所定义的模块? – Sajeetharan

+0

@Sajeetharan是的模块被定义,忘记添加它。 –

回答

3

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

假定test方法应返回一个承诺。它返回undefined,这就是错误所说的。

应该

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

    ... 
} 
+0

当我从工厂console.log响应时,它将数据输出到控制台。但是控制器会抛出错误。 –

+0

不确定你的意思。问题中的代码错过了'return'语句,这就是为什么你'无法读取属性',然后'未定义'的错误。如果您在应用此答案后继续出现错误,请提供一个答案,以便可以复制该问题。 – estus

+0

感谢您的帮助。它解决了我的问题。 –

0

它不应该是:

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

至少,这是版本< 1.4.8

适用版本> 1.4.8试试这个:

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

我使用AngularJs版本1.6.0,但即使我尝试这样也会引发另一个错误:** $ http.get(...)。success不是函数** –

+0

我将其更改为包含> 1.4.8看看是否改变了一切。 – rrd

+0

这并不能解决我的问题,因为我的逻辑是一样的。 –

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

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的值错误地转换一个甩来解析为的undefined的值的履行承诺。

从文档:

由于e13eea,从承诺的onFulfilledonRejection处理程序引发的错误处理完全一样,经常拒绝。在此之前,它也会被传递给$exceptionHandler()(除了拒绝承诺并将错误作为原因)。

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

相关问题