Javascript 动态改变角度';s$间隔延迟
我有一个旅游服务,它返回一个解析为旅游对象的承诺。巡更对象有一些场景,每个场景都有一些热点。在主视图的控制器中,我有一个“private”Javascript 动态改变角度';s$间隔延迟,javascript,angularjs,settimeout,Javascript,Angularjs,Settimeout,我有一个旅游服务,它返回一个解析为旅游对象的承诺。巡更对象有一些场景,每个场景都有一些热点。在主视图的控制器中,我有一个“private”\u init() 我正在使用一个间隔,该间隔应该无限地在场景中逐个移动,但我希望场景之间的延迟基于当前活动场景的热点数量,例如,具有2个热点的场景应持续7.5秒,具有1个热点的场景应持续5秒,等等 以下是我目前掌握的情况: var i = 0, ready, scenesCount, activeScene, duration, transition = n
\u init()
我正在使用一个间隔,该间隔应该无限地在场景中逐个移动,但我希望场景之间的延迟基于当前活动场景的热点数量,例如,具有2个热点的场景应持续7.5秒,具有1个热点的场景应持续5秒,等等
以下是我目前掌握的情况:
var i = 0, ready, scenesCount, activeScene, duration, transition = null;
_init();
// Later on down...
function _init()
{
ready = false;
AlexaTourApi.getTour( null).then( function ( res) {
$log.log( 'AlexaTourController got tour', res);
$scope.tour = res;
scenesCount = $scope.tour.scenes.length;
activeScene = 0;
duration = (getActiveScene().hotspots.length + 1) * 2500;
ready = true;
transition = $timeout( _doTransition(), duration);
});
}
function _doTransition()
{
activeScene = (i++ % scenesCount);
duration = (getActiveScene().hotspots.length + 1) * 2500;
transition = $timeout( _doTransition(), duration);
}
编辑:
我根据Quirimo的建议实现了一些新代码:
function _init()
{
ready = false;
AlexaTourApi.getTour( null).then( function ( res) {
$log.log( 'AlexaTourController got scenes', res);
$scope.tour = res;
scenesCount = $scope.tour.scenes.length;
activeScene = 0;
duration = (getActiveScene().hotspots.length + 1) * 2500;
ready = true;
_resetInterval();
});
}
function _resetInterval()
{
if ( transition !== null) {
$interval.cancel( transition);
}
duration = (getActiveScene().hotspots.length + 1) * 2500;
transition = $interval( _doTransition(), duration);
}
function _doTransition()
{
activeScene = (i++ % scenesCount);
}
只是现在我得到了一个f不是一个函数
异常。你有一个$timeout
递归调用另一个$timeout
。等等这意味着超时永远不会停止,因为当内部执行的代码停止时,超时就会停止
使用$interval
更改代码,在开始新代码之前,请清除上一个代码。它应该很好用
另外,我认为你也可以在开始新的一个之前取消上一个超时。请参阅$timeout.cancel
方法
var i = 0,
ready, scenesCount, activeScene, duration, transition = null;
_init();
// Later on down...
function _init() {
ready = false;
AlexaTourApi.getTour(null).then(function(res) {
$log.log('AlexaTourController got tour', res);
$scope.tour = res;
scenesCount = $scope.tour.scenes.length;
activeScene = 0;
duration = (getActiveScene().hotspots.length + 1) * 2500;
ready = true;
clearTimeoutAndStartNewOne();
});
}
// here we clear the timeout and then we start a new one which is connected to the other function
function clearTimeoutAndStartNewOne() {
if (transition !== null) {
$timeout.cancel(transition);
}
duration = (getActiveScene().hotspots.length + 1) * 2500;
transition = $timeout(_doTransition, duration);
}
// here we simply implement the logic of the timeout to be repeated
function _doTransition() {
activeScene = (i++ % scenesCount);
}
如果我理解正确,我应该修改我的\u doTransition()
函数,使其在开始工作之前首先取消间隔/超时?是的,您需要在开始新的间隔/超时之前清除超时。也许你可以简单地在新超时开始之前在\u doTransition
中添加这一行,它可能会工作:$timeout.cancel(transition)代码>。然后在那之后,开始新的超时你在做什么对不起我的坏。不幸的是,我建议您进行的快速更改产生了相同的问题,因为在超时内,您仍然会启动一个新的超时,因此它不会停止。更新答案贴了一点代码,在这里写代码太糟糕了:)哦,好吧,我没明白。为什么你不重新考虑一下你的逻辑,把$interval
作为我的第一个建议?它将始终在后台工作,然后使用一个条件进行检查,以清除一个间隔并以您想要的新持续时间开始一个新的间隔。这有意义吗?对不起,我的错,代码不应该有()
。请尝试以下操作:transition=$timeout(\u doTransition,duration)代码>