cab5b69a5e
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
87 lines
2.6 KiB
Diff
87 lines
2.6 KiB
Diff
diff --git a/lib/module/threads.js b/lib/module/threads.js
|
|
index dd3a7f1ab12e5a8030af7f17b6a7a891e0b645d2..7d48ccbf95f00724db6b083a7155f25aadd6b8f5 100644
|
|
--- a/lib/module/threads.js
|
|
+++ b/lib/module/threads.js
|
|
@@ -2,7 +2,6 @@
|
|
|
|
import { WorkletsError } from './debug/WorkletsError';
|
|
import { IS_JEST } from './platformChecker';
|
|
-import { mockedRequestAnimationFrame } from './runLoop/uiRuntime/mockedRequestAnimationFrame';
|
|
export function scheduleOnUI(worklet, ...args) {
|
|
enqueueUI(worklet, args);
|
|
}
|
|
@@ -24,38 +23,50 @@ export function scheduleOnRN(fun, ...args) {
|
|
queueMicrotask(args.length ? () => fun(...args) : fun);
|
|
}
|
|
export function runOnUIAsync(worklet, ...args) {
|
|
- return new Promise(resolve => {
|
|
- enqueueUI(worklet, args, resolve);
|
|
+ return new Promise((resolve, reject) => {
|
|
+ enqueueUI(worklet, args, resolve, reject);
|
|
});
|
|
}
|
|
let runOnUIQueue = [];
|
|
-function enqueueUI(worklet, args, resolve) {
|
|
- if (IS_JEST) {
|
|
- mockedRequestAnimationFrame(() => {
|
|
- const result = worklet(...args);
|
|
- resolve?.(result);
|
|
- });
|
|
- } else {
|
|
- const job = [worklet, args, resolve];
|
|
- runOnUIQueue.push(job);
|
|
- if (runOnUIQueue.length === 1) {
|
|
+function enqueueUI(worklet, args, resolve, reject) {
|
|
+ const job = [worklet, args, resolve, reject];
|
|
+ runOnUIQueue.push(job);
|
|
+ if (runOnUIQueue.length === 1) {
|
|
+ if (IS_JEST) {
|
|
flushUIQueue();
|
|
+ } else {
|
|
+ queueMicrotask(flushUIQueue);
|
|
}
|
|
}
|
|
}
|
|
+let offset = 0;
|
|
function flushUIQueue() {
|
|
- queueMicrotask(() => {
|
|
- const queue = runOnUIQueue;
|
|
- runOnUIQueue = [];
|
|
- requestAnimationFrameImpl(() => {
|
|
- queue.forEach(([workletFunction, workletArgs, jobResolve]) => {
|
|
- const result = workletFunction(...workletArgs);
|
|
- if (jobResolve) {
|
|
- jobResolve(result);
|
|
+ const queue = runOnUIQueue;
|
|
+ runOnUIQueue = [];
|
|
+ requestAnimationFrame(() => {
|
|
+ offset = 0;
|
|
+ while (queue.length > offset) {
|
|
+ try {
|
|
+ drainUIQueue(queue);
|
|
+ } catch (e) {
|
|
+ const [, , , jobReject] = queue[offset - 1];
|
|
+ if (jobReject) {
|
|
+ jobReject(e);
|
|
+ } else {
|
|
+ console.error(e);
|
|
}
|
|
- });
|
|
- });
|
|
+ }
|
|
+ }
|
|
});
|
|
}
|
|
-const requestAnimationFrameImpl = !globalThis.requestAnimationFrame ? mockedRequestAnimationFrame : globalThis.requestAnimationFrame;
|
|
+function drainUIQueue(queue) {
|
|
+ while (queue.length > offset) {
|
|
+ const [workletFunction, workletArgs, jobResolve] = queue[offset];
|
|
+ offset++;
|
|
+ const result = workletFunction(...workletArgs);
|
|
+ if (jobResolve) {
|
|
+ jobResolve(result);
|
|
+ }
|
|
+ }
|
|
+}
|
|
//# sourceMappingURL=threads.js.map
|