为什么我的ForEach循环只抓取数组中的最后一项?

时间:2014-07-28 23:26:19

标签: arrays angularjs foreach indexing timeout

我想为我的数组中的每个项目执行一个函数,但它只触发数组中的最后一项,我不确定如何修复它:

$scope.PlayMovie =function(){
    angular.forEach($scope.CamArr, function(value, index){
        $timeout($pyx.globe.camera(value.cam, 3000), 5000);
    });
}; 

设置地球仪相机需要一个相机对象和一个时间。因此,移动到该位置需要3秒钟。我把它放在一个时间,所以它会在到达该位置后等待2秒然后移动到下一个位置。这似乎只是抓住了我的数组中的最后一个索引。我已经要求在添加相机对象并且对象进入阵列时显示计数,因此我不确定我在这里做错了什么。

点击按钮即可调用播放电影。

提前感谢您的帮助。如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

所以,有两件事正在发生:

  1. 这是由forEach循环立即评估的,并且您为该函数的返回值设置了超时:

    $pyx.globe.camera(value.cam, 3000)
    

    你可能想做

    $timeout(function() { $pyx.globe.camera(value.cam, 3000) }, 5000);
    
  2. 你的foreach循环正在设置几个超时,从现在起5秒内都会激活。听起来你想立刻(在0秒内),然后从现在开始一个5秒,然后从现在开始10秒,等等。尝试将延迟乘以索引(0,1,2,3等),像这样:

    $scope.PlayMovie = function() {
        angular.forEach($scope.CamArr, function(value, index){
            $timeout(function() { $pyx.globe.camera(value.cam, 3000) }, index * 5000);
        });
    }; 
    

答案 1 :(得分:0)

每次循环都会分配相同的值,所以你自然会得到一个只有循环中最后一个值的调用。通过这样做来修复它:

$scope.PlayMovie =function(){
    var timeoutArray = [];
    angular.forEach($scope.CamArr, function(value, index){
        timeoutArray.push($timeout($pyx.globe.camera(value.cam, 3000), 5000));
    });
}; 

这应该每次都给你一个不同的超时,如果你需要取消一个或多个,可以单独引用它们。