首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取角$interval的状态-检查间隔是否已取消

如何获取角$interval的状态-检查间隔是否已取消
EN

Stack Overflow用户
提问于 2014-04-18 05:09:21
回答 3查看 8.4K关注 0票数 5

我对角(和JS)还不熟悉,只是有点困惑。

我开始计时器时:

代码语言:javascript
运行
复制
var getOverviewMapTimer = $interval($scope.UpdateOverviewMap, UPDATE_FREQUENCY); 

而且,如果我理解的话,getOverviewMapTimer是一个“承诺”。

我希望能够检查计时器是否在运行&如果我曾经这样做的话。

$interval.cancel(getOverviewMapTimer);,那么getOverviewMapTimer就是null,我可以检查一下。

情况似乎并非如此。

我是否必须明确地摧毁承诺(对被取消的计时器的承诺是什么?)如果是这样的话,我将如何&然后必须显式地将其设置为null

我认为我应该使用cancel(getOverviewMapTimer);,但不是100%肯定,因为getOverviewMapTimer之后仍然是非空的。

谢谢你的帮忙

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-18 07:00:42

var getOverviewMapTimer = $interval(...);之后,getOverviewMapTimer持有对一个对象的引用(这恰好是一个承诺)。

执行$interval.cancel(getOverviewMapTimer)传递(并取消) getOverviewMapTimer变量引用的对象,但无法将对象转换为null。getOverviewMapTimer变量将继续保存对诺言对象的引用,将其设置为null的唯一方法是通过一个新赋值(即明确地将其设置为空):

代码语言:javascript
运行
复制
var getOverviewMapTimer = $interval(...);
...
$interval.cancel(getOverviewMapTimer);
getOverviewMapTimer = null;

高级主题:

有一种简单的方法可以很好地找出是否取消了某个区间承诺(例如,将自定义的cancelled属性添加到允诺对象,并在取消该间隔时将其值设置为true )。

Angular足够酷,它具有难以置信的灵活性和可扩展性,因此使用Service Decorator的概念,我们能够“增强”$interval服务,扩展其cancel()方法以添加cancelled属性,并在取消间隔承诺时将其值设置为true

代码语言:javascript
运行
复制
/* Service Decorators can be configured in `config` blocks */
app.config(function ($provide) {

    /* Register a decorator for the `$interval` service */
    $provide.decorator('$interval', function ($delegate) {

        /* Keep a reference to the original `cancel()` method */
        var originalCancel = $delegate.cancel;

        /* Define a new `cancel()` method */
        $delegate.cancel = function (intervalPromise) {

            /* First, call the original `cancel()` method */
            var retValue = originalCancel(intervalPromise);

            /* If the promise has been successfully cancelled,
             * add a `cancelled` property (with value `true`) */
            if (retValue && intervalPromise) {
                intervalPromise.cancelled = true;
            }

            /* Return the value returned by the original method */
            return retValue;
        };

        /* Return the original (but "augmented") service */
        return $delegate;
    });
});

现在,我们可以像往常一样使用$interval服务,并且我们总是可以检查interval-诺言的cancelled属性,以确定它是否已被取消。

代码语言:javascript
运行
复制
var getOverviewMapTimer = $interval(...);
...
console.log(!!getOverviewMapTimer.cancelled);   // false
$interval.cancel(getOverviewMapTimer);
console.log(!!getOverviewMapTimer.cancelled);   // true

看,还有,这个short demo

票数 16
EN

Stack Overflow用户

发布于 2014-04-18 08:53:44

从技术上讲,在调用getOverviewMapTimer之后,null是不可能的。

如果你想让它为空,你必须自己去做。在取消间隔后或通过回调立即:

代码语言:javascript
运行
复制
if ($interval.cancel(getOverviewMapTimer)) {
  getOverviewMapTimer = null;
}

代码语言:javascript
运行
复制
var getOverviewMapTimer = $interval($scope.UpdateOverviewMap, UPDATE_FREQUENCY);
getOverviewMapTimer.catch(function() { getOverviewMapTimer = null; }); 

但是,请注意,回调是异步的。

票数 2
EN

Stack Overflow用户

发布于 2015-12-26 11:31:26

简单

代码语言:javascript
运行
复制
var interval = $interval(function() { }, 1000);
console.log(interval.$$state.status); //0

$interval.cancel(interval);
console.log(interval.$$state.status); //2

if(interval.$$state.status == 0)
    //valid
else
    //invalid
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23147757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档