我有一个像这样的数组:
var myArray = array(
[0] => array(
[0]=>{reel:2, location:1}
[1]=>{reel:1, location:7}
)
[1] => array(
[0]=>{reel:2, location:1}
[1]=>{reel:3, location:6}
[2]=>{reel:1, location:5}
)
);
需要将动画放在上述数组的每个项目上,因此我正在数组上运行一个for循环并在其中调用动画函数。
for(var j=0; j < myArray.length; j++){
animateItems(myArray[j]);
}
function animateItems(params){
for(var p = 0; p < params.length; p++){
params[p].reelEl.animations.add('highlightAnim');
params[p].reelEl.animations.play('highlightAnim', 13, true);
}
}
但是问题是所有项目动画都同时发生,但是我需要它们一个接一个。
试图做这样的事情,但没有帮助:
for(var j=0; j < myArray.length; j++){
(function() {
setTimeout(function(){animateItems(myArray[j]);}, j * 1000);
})(j);
}
似乎我做错了什么。任何想法将不胜感激。
答案 0 :(得分:2)
您没有在IIFE签名中添加参数(j)(因此在您的示例中,它仍然是for
循环中的 j 变量):
for(var j=0; j < myArray.length; j++){
(function(index) {
setTimeout(function(){animateItems(myArray[index]);}, index * 1000);
})(j);
}
这应该有效。
答案 1 :(得分:0)
我认为,与其等待一段时间来完成动画。您可以使用回调onAnimationComplete
并执行递归函数。像这样:
var myArray = [[{ reel: 2, location: 1 },
{ reel: 1, location: 7 }],
[{ reel: 2, location: 1 },
{ reel: 3, location: 6 },
{ reel: 1, location: 5 }]];
function animation(x = 0, z = 0) {
console.log(myArray[x][z])
myArray[x][z].reelEl.animations.add('highlightAnim');
myArray[x][z].reelEl.animations.play('highlightAnim', 13, true);
myArray[x][z].reelEl.onComplete.add(function () {
if (myArray[x][z + 1]) {
z++
} else if (myArray[x + 1]) {
x++
z = 0;
}else{
return;
}
animation(x, z) }, this);//<-- recursive callback
}
animation();