mirror of
https://github.com/status-im/react-native.git
synced 2025-01-17 13:01:13 +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
45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
/**
|
|
* Copyright 2004-present Facebook. All Rights Reserved.
|
|
*/
|
|
'use strict';
|
|
|
|
jest.dontMock('InteractionMixin');
|
|
|
|
describe('InteractionMixin', () => {
|
|
var InteractionManager;
|
|
var InteractionMixin;
|
|
var component;
|
|
|
|
beforeEach(() => {
|
|
jest.resetModuleRegistry();
|
|
InteractionManager = require('InteractionManager');
|
|
InteractionMixin = require('InteractionMixin');
|
|
|
|
component = Object.create(InteractionMixin);
|
|
});
|
|
|
|
it('should start interactions', () => {
|
|
var timeout = 123;
|
|
component.createInteractionHandle(timeout);
|
|
expect(InteractionManager.createInteractionHandle).toBeCalled(timeout);
|
|
});
|
|
|
|
it('should end interactions', () => {
|
|
var handle = {};
|
|
component.clearInteractionHandle(handle);
|
|
expect(InteractionManager.clearInteractionHandle).toBeCalledWith(handle);
|
|
});
|
|
|
|
it('should schedule tasks', () => {
|
|
var task = jest.genMockFunction();
|
|
component.runAfterInteractions(task);
|
|
expect(InteractionManager.runAfterInteractions).toBeCalledWith(task);
|
|
});
|
|
|
|
it('should end unfinished interactions in componentWillUnmount', () => {
|
|
var handle = component.createInteractionHandle();
|
|
component.componentWillUnmount();
|
|
expect(InteractionManager.clearInteractionHandle).toBeCalledWith(handle);
|
|
});
|
|
});
|