AngularJS 1.1.5 $resource.get не создает запрос XHR из setTimeout

Я задал этот вопрос на форуме Google для AngularJS и до сих пор не слышал об этом. Может ли кто-нибудь помочь мне понять, что здесь происходит?

Я пытаюсь периодически обновлять ресурс, и, похоже, он не работает. Я отслеживал это до тех пор, пока обещание не было получено от службы $http, но запрос XHR никогда не создается и не запускается при вызове метода в setTimeout. Однако, если я сделаю то же самое без setTimeout, все будет работать нормально.

Рабочий JSFiddle: http://jsfiddle.net/hponnu/Z62QN/2/

window.root_module = angular.module("MyApp", ['ngResource']);
function MainController($scope, $resource) {
    $scope.buttonClick = function () {
        var res = $resource("http://www.google.com");
        res.get({}, function (response) {
            alert("response");
        }, function (err) {
            alert("error");
        });
    }
}

Неработающий JSFiddle: http://jsfiddle.net/hponnu/H8aEt/10/

window.root_module = angular.module("MyApp", ['ngResource']);
window.count = 0;
function MainController($scope, $resource) {
    $scope.buttonClick = function () {
       setTimeout(function () {
            alert("timeout: " + window.count);
            var res = $resource("http://www.google.com");
            res.get({},
                function (response) {
                    alert("response: " + window.count);
                    window.count++;
                }, function (err) {
                    alert("error: " + window.count);
                    window.count++;
                });
       }, 1000);
    }

}

Как вы ясно увидите в сломанном jsfiddle, предупреждение об ошибке не запускается для первого запроса, если только повторное нажатие кнопки не вызывает событие щелчка. Я начал замечать это с AngularJS 1.1.4.

Есть идеи/предложения?

PS: https://groups.google.com/forum/#!topic/angular/t28mazamT0E – это ссылка на ветку групп Google.


person ponnu    schedule 07.08.2013    source источник


Ответы (1)


Вы всегда должны использовать Angularjs $timeout вместо setTimeout().

function MainController($scope, $resource, $timeout) {
    $scope.buttonClick = function () {
        $timeout(function () {
            ...
        }, 1000);
    }
}
person zs2020    schedule 07.08.2013
comment
Вот объяснение из ветки в группах google. Происходит то, что когда вы используете setTimeout, вы фактически выходите за пределы angular $digest. Чтобы исправить это, после завершения tmeout выполните $scope.$apply() или, что еще лучше, внедрите службу $timeout и используйте ее вместо этого (идентично setTimeout). - person ponnu; 07.08.2013
comment
@ponnu Да, setTimeout() не обрабатывает scopy.apply(). - person zs2020; 07.08.2013