跳到主要内容

InteractionManager

InteractionManager 允许在任何交互/动画完成后调度长时间运行的工作。特别是,这允许 JavaScript 动画平稳运行。

应用程序可以通过以下方式调度任务以在交互后运行

tsx
InteractionManager.runAfterInteractions(() => {
// ...long-running synchronous task...
});

与其他调度方案比较

  • requestAnimationFrame() 用于随时间动画视图的代码。
  • setImmediate/setTimeout() 稍后运行代码,请注意这可能会延迟动画。
  • runAfterInteractions() 稍后运行代码,而不会延迟活动动画。

触摸处理系统将一个或多个活动触摸视为“交互”,并将延迟 runAfterInteractions() 回调,直到所有触摸结束或被取消。

InteractionManager 还允许应用程序通过在动画开始时创建交互“句柄”并在完成后清除它来注册动画

tsx
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 方法的 PromiseTask 对象,该方法返回一个 Promise。如果提供了 PromiseTask,则它将完全解析(包括也通过 runAfterInteractions 调度更多任务的异步依赖项),然后才开始下一个可能更早同步排队的任务。

默认情况下,排队的任务会在一个 setImmediate 批处理中以循环方式一起执行。如果调用 setDeadline 并传入一个正数,则任务将仅执行到截止时间(以 js 事件循环运行时间为准)接近时,此时执行将通过 setTimeout 暂停,允许触摸等事件开始交互并阻止排队的任务执行,从而使应用程序响应更快。


示例

基本

高级

参考

方法

runAfterInteractions()

tsx
static runAfterInteractions(task?: (() => any) | SimpleTask | PromiseTask);

安排一个函数在所有交互完成后运行。返回一个可取消的“promise”。


createInteractionHandle()

tsx
static createInteractionHandle(): Handle;

通知管理器交互已开始。


clearInteractionHandle()

tsx
static clearInteractionHandle(handle: Handle);

通知管理器交互已完成。


setDeadline()

tsx
static setDeadline(deadline: number);

正数将使用 setTimeout 在 eventLoopRunningTime 达到截止时间值后调度任何任务,否则所有任务将在一个 setImmediate 批处理中执行(默认)。