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

如何在After Effects的ExtendScript中实现带延迟的循环执行?

在After Effects ExtendScript中实现带延迟的数组遍历

AE的ExtendScript环境和前端JavaScript不一样,setInterval这类浏览器API根本不支持,$.delay()是同步阻塞的,会直接卡住AE界面直到延迟结束;你之前用app.setSchedule没生效,大概率是用错了姿势——不能在循环里一次性把所有迭代都调度出去,得一步步来,每处理完一项再调度下一项。

下面是可行的实现方案:

核心思路

用闭包保存数组和当前遍历索引,定义一个单步处理函数,每完成一项的逻辑后,用app.setSchedule()指定下一次执行的延迟时间,这样就能实现顺序延迟遍历。

完整示例代码

// 要遍历的目标数组
const targetItems = ["素材A", "图层B", "效果C", "关键帧D"];
// 当前遍历的索引
let currentIdx = 0;

// 单步处理函数,负责处理当前项并调度下一次迭代
function handleNextItem() {
  // 遍历结束的判断
  if (currentIdx >= targetItems.length) {
    $.writeln("所有项处理完成");
    return;
  }

  // 取出当前项,执行你的业务逻辑
  const currentItem = targetItems[currentIdx];
  runYourCustomFunction(currentItem); // 替换成你自己的函数

  // 索引自增
  currentIdx++;

  // 设置0.5-1秒的延迟(500-1000毫秒),调度下一次处理
  const delayTime = Math.random() * 500 + 500;
  app.setSchedule(delayTime, handleNextItem);
}

// 你的自定义业务函数示例,替换成实际逻辑
function runYourCustomFunction(item) {
  // 比如创建图层、修改属性、输出日志等操作
  $.writeln(`正在处理:${item},时间:${new Date().toLocaleTimeString()}`);
}

// 启动遍历流程
handleNextItem();

关键说明

  • app.setSchedule(delay, callback)是AE脚本唯一靠谱的非阻塞定时方法,延迟单位是毫秒,必须在每一步完成后再调度下一次,不能批量调度。
  • 如果需要中途终止遍历,可以加一个全局开关变量,在handleNextItem开头判断这个开关,为true就直接return。
  • 避免在业务函数里用同步阻塞的操作(比如alert()),否则会打断延迟流程。

内容的提问来源于stack exchange,提问作者Bench

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:55:11