Promise 本身不直接控制动画,但能协调分步引导动画执行时机;需将每步动画/交互封装为返回 Promise 的函数,再用 async/await 或 .then() 链式调用,确保串行、可中断、易维护。

Promise 本身不直接控制动画,但它能很好地协调分步引导动画的执行时机——比如按顺序高亮页面元素、显示提示框、等待用户点击后再进行下一步。关键在于把每一步动画(含延时、DOM 操作、交互等待)封装为返回 Promise 的函数,再用 async/await 或 .then() 链式调用,确保严格串行、可中断、易维护。
1. 将动画/交互步骤封装为 Promise 函数
每一步引导动作(如淡入提示、滚动到元素、监听一次点击)都应返回一个 Promise,在完成或失败时 resolve/reject:
-
纯延时动画:用
setTimeout包装,例如wait(800)返回new Promise(r => setTimeout(r, 800)) -
DOM 动画完成监听:使用
element.animate().onfinish或 CSS transitionend 事件,触发 resolve -
等待用户操作:例如监听一次按钮点击,用
once: true添加事件监听器,点击后 resolve 并移除监听器
2. 用 async/await 编排引导流程(推荐)
逻辑清晰、支持 try/catch 错误处理,也方便插入条件分支(如跳过某步):
async function startTour() {
try {
await highlightStep('#search-input', '请输入关键词');
await wait(600);
await highlightStep('#submit-btn', '点击搜索');
await waitForClick('#submit-btn'); // 等待真实点击
await showSuccess('搜索已触发!');
} catch (e) {
console.log('引导中断:', e.message);
}
}
3. 高亮/动效建议:配合 CSS 实现平滑过渡
JavaScript 只负责控制类名或样式开关,动画交给 CSS,避免 JS 动画卡顿:
立即学习“Java免费学习笔记(深入)”;
- 给目标元素添加临时类名(如
tour-highlight),CSS 中定义box-shadow、transform: scale()和transition - 提示气泡可用
position: fixed+opacity+transform过渡,配合getBoundingClientRect()动态定位 - 避免在 Promise 步骤中直接写
element.style.animation = 'xxx',优先用 class 切换
4. 支持暂停、退出与状态管理
实际引导常需响应用户行为(如点击「跳过」或关闭按钮):
- 每个 Promise 步骤内部监听全局取消信号(如一个
isCancelled标志位或 AbortController) - 「跳过」按钮绑定
reject(new Error('skipped')),让后续await被捕获并退出流程 - 维护当前步数(
stepIndex)和总步数,用于渲染进度条或步骤指示器
不复杂但容易忽略:Promise 分步本质是“控制权移交”,不是魔法。只要每步返回可等待的异步单元,就能自然形成节奏感强、响应明确的引导体验。


















