Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态改变角度';s$间隔延迟_Javascript_Angularjs_Settimeout - Fatal编程技术网

Javascript 动态改变角度';s$间隔延迟

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

我有一个旅游服务,它返回一个解析为旅游对象的承诺。巡更对象有一些场景,每个场景都有一些热点。在主视图的控制器中,我有一个“private”
\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)