javascript - 取消 $timeout 不起作用

标签 javascript angularjs timeout

执行取消 $timeout 的简单任务不起作用。我有一个包含给用户的消息的状态框,因此如果在超时结束之前设置了新消息,那么我需要通过取消并重新启动超时来重新启动超时。

我查看了该网站上的文档和其他答案,但我似乎没有做任何不同的事情。

我没有收到任何错误。我做错了什么?

服务:

core.service('statusHandler', ['$timeout', function($timeout) {

    var status = {
        message: '',
        isSuccess: false,
        isActive: false,
        isBoxDirective: false,
        timeout: null
    };

    this.resetStatus = function() {
        status.isSuccess = false;
        status.isActive = false;
        status.isBoxDirective = false;

        $timeout.cancel(status.timeout);
    };

    this.setStatus = function(message, isSuccess, isBoxDirective) {

        status.message = message || 'Something went wrong';
        status.isSuccess = isSuccess;
        status.isActive = true;
        status.isBoxDirective = isBoxDirective;

        status.timeout = $timeout(function() {
            status.isActive = false;
        }, 5000);
    };

    this.getStatus = function() {
        return status;
    };
}]);

然后我在这样的指令中使用它:

core.directive('statusBox', ['statusHandler', function(statusHandler) {

    return {
        scope: {},
        controller: 'MainCtrl',
        controllerAs: 'core',
        templateUrl: '/app/views/components/core/status-box.html',
        link: function(scope, element, attrs, ctrl) {

            scope.$watch(function() {
                return statusHandler.getStatus();
            }, function(newVal, oldVal) {
                ctrl.status = newVal;
            }, true);
        }
    };
}]);

从 Controller 调用 resetStatus(),如下所示:

...

var completed;

... some logic to set completed to true ...

$scope.$watch(function() {
    return completed;
}, function(newVal) {

    if (completed) {

        statusHandler.resetStatus();
        statusHandler.setStatus('Videos have finished uploading and are now being processed', true, false);
    }
});

...

最佳答案

通过在开始时在同一函数中分配新的超时之前清除先前的超时来解决这个问题。这有什么窍门!

这似乎是某种函数作用域问题,因为从 resetStatus() 调用函数没有执行任何操作。

this.setStatus = function(message, isSuccess, isBoxDirective) {

    $timeout.cancel(status.timeout);

    status.message = message || 'Something went wrong';
    status.isSuccess = isSuccess;
    status.isActive = true;
    status.isBoxDirective = isBoxDirective;

    status.timeout = $timeout(function() {
        status.isActive = false;
    }, 5000);
};

关于javascript - 取消 $timeout 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34672392/

相关文章:

javascript - facebook JS SDK 登录困惑

javascript - JS - 如何检测浏览器何时拒绝本地文件?

AngularJS watch 不工作

C++ 在时间后调用函数或取消

javascript - 我可以在单个警报中对 javascript 数组的所有元素进行alert() 吗?

javascript - react 组件和作为 react 组件的功能有什么区别

ios - 打开 facebook 页面进入 facebook 应用 Ios + ionic

javascript - 创建一个新对象会解除我的变量的绑定(bind)吗?

c - 如何绕过 "foreground lock timeout"激活我的窗口?

java - 如何确定可以延长其响应时间的 Web 服务之外所花费的时间