You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在循环中用await结合Promise.all实现动画分阶段顺序播放?

解决动画阶段顺序执行问题

问题根源

当前代码中,game.animationPhases的每个元素是直接调用animate()后得到的finished Promise——这会立即触发动画。所有阶段的动画在初始化这个对象时就已经同时启动,后续的await Promise.all只是等待已运行的动画结束,自然无法实现阶段顺序执行。

修改方案

1. 调整动画阶段存储结构

将每个动画改为函数形式,只有主动调用函数时才会触发动画,避免提前执行:

game.animationPhases = {
    phaseA: [ function() { return x.animate(example).finished; } ],
    phaseB: [ function() { return y.animate(example).finished; }, function() { return z.animate(example).finished; } ],
    phaseC: [] 
}

2. 更新顺序执行函数

遍历阶段时,先调用当前阶段的所有动画函数触发动画,再用Promise.all等待该阶段动画全部完成后进入下一阶段:

async function animatePhasesInSequence(){
    // 遍历所有阶段(若需严格固定顺序,可手动指定数组如['phaseA', 'phaseB', 'phaseC'])
    let phaseKeys = Object.keys(game.animationPhases);
    for (let i = 0; i < phaseKeys.length; i++) {
        let key = phaseKeys[i];
        let animationFns = game.animationPhases[key];
        
        if (animationFns.length > 0) {
            // 触发当前阶段所有动画,收集Promise
            let animationPromises = animationFns.map(function(fn) {
                return fn();
            });
            await Promise.all(animationPromises);
        }
    }
}

说明

修改后,动画会严格按照phaseA → phaseB → phaseC的顺序执行:每个阶段内的动画同时启动,等待全部完成后才会进入下一个阶段,完全符合需求。

内容的提问来源于stack exchange,提问作者Adam Hunter Peck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:30