【问题标题】:$timeout.cancel() is not cancelling the timeout$timeout.cancel() 没有取消超时
【发布时间】:2017-09-20 13:32:23
【问题描述】:

我正在运行 3 分钟超时,并且在该超时期间,我正在特定持续时间运行另一个函数。但是当我尝试取消超时时,它仍在运行,并且其中的函数仍在执行。这是我的代码

$scope.time = 180000;
var timer = function() {
    if ($scope.time > 0) {
        $scope.time -= 1000;
        var durations = [170000, 150000, 130000, 110000, 90000, 70000, 50000, 30000, 10000];
        if (durations.includes($scope.time)) {
            dataService.acceptNotify(payload).then(function(response) {
                console.log(response);
                if (response.data.success === true) {
                    $mdToast.showSimple(response.data.msg);
                    $mdDialog.hide();
                    $timeout.cancel(timeout);
                }
            })
        }
        $timeout(timer, 1000);
    } else {
        $mdDialog.hide();
    }
}
var timeout = $timeout(timer, 1000);

【问题讨论】:

  • 在取消超时后立即将其设置回来而不存储其参考
  • @dev8080 我已经建立了一个倒数计时器,我需要调用它 $timeout(timer, 1000);在内部保持运行
  • 但是当你取消超时时,你只会取消变量“超时”中的那个,而不是你在循环中开始的那个。
  • 请尝试我建议的更改。

标签: javascript angularjs timeout


【解决方案1】:

您只是没有将计时器实例捕获到您的变量中,因此没有取消它。

尝试在您的代码中更改这一行:

$timeout(timer, 1000);

timeout = $timeout(timer, 1000);

【讨论】:

    【解决方案2】:

    我相信超时正在发生,但您无法观察到它。我看到您使用此代码每 1 秒调用一次函数计时器

    var timeout = $timeout(timer, 1000);
    

    但是您在获得响应 api 后取消了它,同时会启动许多实例,这些实例将调用那么多次。所以实际上它正在取消,但在几次之后。 例如,如果您在 20 秒内收到响应,那么它将在调用 api 20 次后取消,因为您的代码就是这样。 如果您在上面告诉我您想做什么,我可以帮助您提供正确的代码

    【讨论】:

    • 我有一个倒数计时器,倒计时到 0 ,在这 3 分钟的时间内,我正在调用 api 来观察服务器中的事件。如果该事件成功发生在那里我将得到一个 response.data.success = true ,当发生这种情况时,我想停止那个计时器。先生,我能解释清楚吗?
    【解决方案3】:

    只需删除您在 else 块上方使用的以下代码。

    $timeout(timer, 1000);
    

    它会为你工作。

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2012-06-09
      • 2013-01-09
      • 1970-01-01
      相关资源
      最近更新 更多