我启动一个计时器:
var getoverviewMapTimer = $interval($scope.UpdateOverviewMap,UPDATE_FREQUENCY);
并且,如果我理解,getoverviewMapTimer是一个“承诺”.
我希望能够检查计时器是否正在运行&如果我曾经如此,那除外
$interval.cancel(getoverviewMapTimer);然后getoverviewMapTimer将为null,我可以检查.
事实似乎并非如此.
我是否必须明确地销毁这个承诺(什么是对取消定时器的承诺?).如果是这样,&然后我必须明确地将其设置为null吗?
我认为我应该使用cancel(getoverviewMapTimer);,但我不是100%肯定,因为getoverviewMapTimer之后仍然是非null.
谢谢你的帮助
解决方法
执行$interval.cancel(getoverviewMapTimer)传递(并取消)getoverviewMapTimer变量引用的对象,但无法将对象转换为null. getoverviewMapTimer变量将继续保持对promise对象的引用,并且将其设置为null的唯一方法是通过新的赋值(即明确地将其设置为null):
var getoverviewMapTimer = $interval(...); ... $interval.cancel(getoverviewMapTimer); getoverviewMapTimer = null;
高级主题:
有一种简单的方法可以找出间隔承诺是否已被取消(例如,在取消间隔时将自定义取消的属性添加到promise对象并将其值设置为true),这听起来确实很好.
Angular非常酷,非常灵活且可扩展,因此使用Service Decorator的概念,我们能够“扩充”$interval服务,扩展其cancel()方法以添加取消的属性,并在取消时将其值设置为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-promise的取消属性,以确定它是否已被取消.
var getoverviewMapTimer = $interval(...); ... console.log(!!getoverviewMapTimer.cancelled); // false $interval.cancel(getoverviewMapTimer); console.log(!!getoverviewMapTimer.cancelled); // true
另见,这是short demo.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。