交互管理器
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
交互管理器允许在交互/动画完成后调度长时间运行的任务。这尤其能确保 JavaScript 动画流畅运行。
应用可通过以下方式安排交互后执行的任务:
InteractionManager.runAfterInteractions(() => {
// ...long-running synchronous task...
});
与其他调度方案的对比:
-
requestAnimationFrame():用于随时间推移对视图进行动画处理的代码。 -
setImmediate/setTimeout():稍后运行代码,请注意这可能会延迟动画。 -
runAfterInteractions():稍后运行代码,且不会延迟正在进行的动画。
触摸处理系统将一次或多次有效触摸视为"交互",会延迟执行 runAfterInteractions() 回调,直到所有触摸事件结束或被取消。
InteractionManager 还允许应用通过创建交互"句柄"来注册动画——在动画开始时创建句柄,并在完成时清除:
const handle = InteractionManager.createInteractionHandle();
// run animation... (`runAfterInteractions` tasks are queued)
// later, on animation completion:
InteractionManager.clearInteractionHandle(handle);
// queued tasks run if all handles were cleared
runAfterInteractions 接收普通回调函数或带有 gen 方法(返回 Promise)的 PromiseTask 对象。若提供 PromiseTask,则会在开始执行可能更早同步入队的下一个任务前,完全解析该对象(包括那些也通过 runAfterInteractions 调度更多任务的异步依赖项)。
默认情况下,队列任务会在单个 setImmediate 批次中循环执行。若使用正数调用 setDeadline,则任务仅在截止时间(基于 JS 事件循环运行时间)临近前执行,此时执行会通过 setTimeout 让出,允许触摸等事件触发交互并阻塞队列任务执行,从而提升应用响应性。
示例
基础
- TypeScript
- JavaScript
进阶
- TypeScript
- JavaScript
参考
方法
runAfterInteractions()
static runAfterInteractions(task?: (() => any) | SimpleTask | PromiseTask);
调度函数在所有交互完成后运行。返回可取消的"Promise"。
createInteractionHandle()
static createInteractionHandle(): Handle;
通知管理器交互已开始。
clearInteractionHandle()
static clearInteractionHandle(handle: Handle);
通知管理器交互已完成。
setDeadline()
static setDeadline(deadline: number);
传入正数将使用 setTimeout 调度任务(在 eventLoopRunningTime 达到截止时间后执行);否则所有任务将在单次 setImmediate 批次中执行(默认行为)。