mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 01:25:39 +00:00
893a54d0cd
Summary: Default behavior should be unchanged. If we queue up a bunch of expensive tasks during an interaction, the default `InteractionManager` behavior would execute them all in one synchronous loop at the end the JS event loop via one `setImmediate` call, blocking the JS thread the entire time. The `setDeadline` addition in this diff enables an option to only execute tasks until the `eventLoopRunningTime` is hit (added to MessageQueue/BatchedBridge), allowing the queue execution to be paused if an interaction starts in between tasks, making the app more responsive. Additionally, if a task ends up generating a bunch of additional tasks asynchronously, the previous implementation would execute these new tasks after already scheduled tasks. This is often fine, but I want it to fully resolve async tasks and all their dependencies before making progress in the rest of the queue, so I added support for `type PromiseTask = {gen: () => Promise}` to do just this. It works by building a stack of queues each time a `PromiseTask` is started, and pops them off the stack once they are resolved and the queues are processed. I also pulled all of the actual queue logic out of `InteractionManager` and into a new `TaskQueue` class to isolate concerns a bit. public Reviewed By: josephsavona Differential Revision: D2754311 fb-gh-sync-id: bfd6d0c54e6410cb261aa1d2c5024dd91a3959e6