我对角(和JS)还不熟悉,只是有点困惑。
我开始计时器时:
var getOverviewMapTimer = $interval($scope.UpdateOverviewMap, UPDATE_FREQUENCY); 而且,如果我理解的话,getOverviewMapTimer是一个“承诺”。
我希望能够检查计时器是否在运行&如果我曾经这样做的话。
$interval.cancel(getOverviewMapTimer);,那么getOverviewMapTimer就是null,我可以检查一下。
情况似乎并非如此。
我是否必须明确地摧毁承诺(对被取消的计时器的承诺是什么?)如果是这样的话,我将如何&然后必须显式地将其设置为null?
我认为我应该使用cancel(getOverviewMapTimer);,但不是100%肯定,因为getOverviewMapTimer之后仍然是非空的。
谢谢你的帮忙
发布于 2014-04-18 07:00:42
在var getOverviewMapTimer = $interval(...);之后,getOverviewMapTimer持有对一个对象的引用(这恰好是一个承诺)。
执行$interval.cancel(getOverviewMapTimer)传递(并取消) getOverviewMapTimer变量引用的对象,但无法将对象转换为null。getOverviewMapTimer变量将继续保存对诺言对象的引用,将其设置为null的唯一方法是通过一个新赋值(即明确地将其设置为空):
var getOverviewMapTimer = $interval(...);
...
$interval.cancel(getOverviewMapTimer);
getOverviewMapTimer = null;高级主题:
有一种简单的方法可以很好地找出是否取消了某个区间承诺(例如,将自定义的cancelled属性添加到允诺对象,并在取消该间隔时将其值设置为true )。
Angular足够酷,它具有难以置信的灵活性和可扩展性,因此使用Service Decorator的概念,我们能够“增强”$interval服务,扩展其cancel()方法以添加cancelled属性,并在取消间隔承诺时将其值设置为true:
/* 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属性,以确定它是否已被取消。
var getOverviewMapTimer = $interval(...);
...
console.log(!!getOverviewMapTimer.cancelled); // false
$interval.cancel(getOverviewMapTimer);
console.log(!!getOverviewMapTimer.cancelled); // true看,还有,这个short demo。
发布于 2014-04-18 08:53:44
从技术上讲,在调用getOverviewMapTimer之后,null是不可能的。
如果你想让它为空,你必须自己去做。在取消间隔后或通过回调立即:
if ($interval.cancel(getOverviewMapTimer)) {
getOverviewMapTimer = null;
}或
var getOverviewMapTimer = $interval($scope.UpdateOverviewMap, UPDATE_FREQUENCY);
getOverviewMapTimer.catch(function() { getOverviewMapTimer = null; }); 但是,请注意,回调是异步的。
发布于 2015-12-26 11:31:26
简单
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
//invalidhttps://stackoverflow.com/questions/23147757
复制相似问题