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)


Винаги трябва да използвате $timeout на Angularjs вместо setTimeout().

function MainController($scope, $resource, $timeout) {
    $scope.buttonClick = function () {
        $timeout(function () {
            ...
        }, 1000);
    }
}
person zs2020    schedule 07.08.2013
comment
Ето обяснението от нишката в групите на Google .. Това, което се случва е, че когато използвате setTimeout, вие всъщност се движите извън ъгловия $digest. За да поправите това, след като tmeout приключи, направете $scope.$apply() или още по-добре - инжектирайте услугата $timeout и я използвайте вместо това (идентично на setTimeout) .. - person ponnu; 07.08.2013
comment
@ponnu Да, setTimeout() не обработва scopy.apply(). - person zs2020; 07.08.2013