Почему срабатывает ошибка [$rootScope:infdig] при использовании $q в AngularJS?

Здравствуйте! Взникла проблема с использованием сервиса $q в AngularJS.
Почему зацикливается цикл $digest и выводится ошибка? Заранее спасибо!

Вот вьюшка:
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

    <link rel="stylesheet" href="bower_components/bootstrap-css/css/bootstrap.css"/>
</head>
<body data-ng-app="AngularApp">

<div class="container" ng-controller="AngularController">
    {{tryDef()}}
</div>

<script src="bower_components/angular/angular.min.js"></script>
<script src="app/angular_app.js"></script>

</body>
</html>


Вот сам Javascript:
(function () {
    var app = angular.module('AngularApp', []);

    app.factory('testDef', ['$q',function ($q) {
        return function (name) {

            var deferred = $q.defer();

            deferred.notify('About to greet ' + name + '.');

            var justTempValue = true;
            if (justTempValue) {
                deferred.resolve('Hello, ' + name + '!');
            } else {
                deferred.reject('Greeting ' + name + ' is not allowed.');
            }

            return deferred.promise;

        };
    }]);

    app.controller('AngularController', ['$scope', 'testDef', function ($scope, testDef) {

        //просто функция, что бы попробовать promises
        $scope.tryDef = function () {

            var promise = testDef('Robin Hood');
            promise.then(function(greeting) {
                console.log('Success: ' + greeting);
            }, function(reason) {
                console.log('Failed: ' + reason);
            }, function(update) {
                console.log('Got notification: ' + update);
            });

            return "5";
        };

    }]);

})();
  • Вопрос задан
  • 2347 просмотров
Пригласить эксперта
Ответы на вопрос 1
@lega
У меня ваш код запустился, только тут проблема:
У вас сделан биндинг "{{tryDef()}}", поэтому ф-ия tryDef вызывается на каждой итерации в $digest, а ф-ия tryDef вызывает testDef где создается и исполняется $q.resolve, который провоцирует вызов $digest. Получается "бесконечный цикл".
Вам нужно вызов testDef убрать в другую ф-ию которая не вызывается на каждой итерации в $digest, например сделать её вызов по клику.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы