2015-06-10 2 views
1

Я пытаюсь показать результат обещания в представлении, но я получаю это исключение. Другие случаи этого исключения, которые я нашел в Google/SO, вызваны ошибками, которые я не вижу в своем коде.Угловые обещания - не могу прочитать свойство затем неопределенного

Я проверял, что использую обещания, я разрешаю обещание внутри функции, переданной в $ timeout, я возвращаю обещание функции getData(), а не функцию, которая разрешает обещание.

Заранее спасибо.

Смотрят

<html ng-app="controller" ng-controller="MyController as controller"> 
<head> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular.min.js"></script> 
    <script type="text/javascript" src="controller.js"></script> 
    <script type="text/javascript" src="services.js"></script> 
</head> 
<body> 
    {{data}} 
</body> 
</html> 

Controller (controller.js)

angular.module('controller', ['services']) 
    .controller('MyController', ['MyService', function(MyService) { 

     MyService.getData().then(function(data) { 
     $scope.data = data; 
     }); 
    }]); 

Service (services.js)

angular.module('services', []) 
.factory('MyService', function($q, $timeout){ 
    var getData = function getData() { 

    var deferred = $q.defer; 

    $timeout(function() { 
     deferred.resolve('Foo'); 
    }, 5000); 

    return deferred.promise; 
    }; 

    return { 
    getData: getData 
    }; 
}); 

Исключение трассировки стека

TypeError: Cannot read property 'then' of undefined 
    at new <anonymous> (controller.js:5) 
    at Object.e [as invoke] (angular.js:4219) 
    at $get.x.instance (angular.js:8525) 
    at angular.js:7771 
    at q (angular.js:334) 
    at M (angular.js:7770) 
    at g (angular.js:7149) 
    at angular.js:7028 
    at angular.js:1460 

ответ

7

Вы не получаете отложенный объект должным образом, вместо того, чтобы deferred переменная содержит ссылку на функцию, вы пропустили вызов Defer конструктора.

var deferred = $q.defer(); 
         ^___Missing this 

также отметить, что вы могли бы просто вернуться $timeout как есть, так как она возвращает обещание. В вашем реальном случае, если вы используете $http, просто верните $ http обещание вместо создания избыточного объекта обещания с deferred pattern.

.factory('MyService', function($q, $timeout){ 
    var getData = function getData() { 

    return $timeout(function() { 
     return 'Foo' ; 
    }, 5000); 
    }; 

    return { 
    getData: getData 
    }; 
+0

Thanks. Я реализовал пример, который я нашел, и они совершили ту же ошибку. – AfterWorkGuinness

+1

@AfterWorkGuinness легко пропустить. Но вы всегда можете перекрестно проверить путем отладки/ведения журнала консоли. – PSL

+0

такой же ошибка я сделал ,, спасибо! – Sid

Смежные вопросы