当前位置: 代码迷 >> JavaScript >> AngularJS $超时工作不同
  详细解决方案

AngularJS $超时工作不同

热度:141   发布时间:2023-06-07 18:21:41.0

我正在尝试使用角度$ timeout运行循环。 这是事情:当我尝试使用此$ timeout用法时。 我每秒收到近15个请求,而不是计划的每2秒1个:

$timeout($scope.checkChallengeAnswerd(challengeTarget), 2000);

但是,如果我做这样的事情,一切都很好:

$timeout(function() { $scope.checkChallengeAnswerd(challengeTarget); }, 2000);

有人可以解释为什么会这样吗?

这是全功能代码块:

    $scope.checkChallengeAnswerd = function (challengeTarget) {

     $http({
        method: 'post',
        url: CHESS_URL + "/challenge/check_answerd/",
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        transformRequest: function(obj) {
            var str = [];
            for(var p in obj)
            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
            return str.join("&");
            },
        data: { "target":challengeTarget }
         }).success(function (data, status, headers, config) {

            $scope.answerd = data.answerd;

            if ($scope.answerd == "wait") {
                //alert("wait");
                $timeout(function() { $scope.checkChallengeAnswerd(challengeTarget); }, 2000);
            }else{
               $("div.b111").hide();
               alert($scope.answerd);
            };
         });
};

$timeout服务将第一个参数作为函数,将第二个参数作为等待执行该函数的毫秒数。

当您使用$timeout($scope.checkChallengeAnswerd(challengeTarget), 2000) ,没有将函数传递到$ timeout服务中,而是传递了函数的返回值。

使用$timeout(function() { $scope.checkChallengeAnswerd(challengeTarget); }, 2000)可以很好地将函数传递给$timeout服务。

另一个选择是将$ scope.checkChallengeAnswerd(challengeTarget)函数表达式修改为:

$scope.checkChallengeAnswerd = function (challengeTarget) {
    return function () {
        $http({
            method: 'post',
            url: CHESS_URL + "/challenge/check_answerd/",
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            transformRequest: function (obj) {
                var str = [];
                for (var p in obj)
                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                return str.join("&");
            },
            data: { "target": challengeTarget }
        }).success(function (data, status, headers, config) {

            $scope.answerd = data.answerd;

            if ($scope.answerd == "wait") {
                //alert("wait");
                $timeout(function () { $scope.checkChallengeAnswerd(challengeTarget); }, 2000);
            } else {
                $("div.b111").hide();
                alert($scope.answerd);
            };
        });
    };
};