diff --git a/packages/react-art/src/ReactARTHostConfig.js b/packages/react-art/src/ReactARTHostConfig.js index 43a563e90aa23..703d2c21c679d 100644 --- a/packages/react-art/src/ReactARTHostConfig.js +++ b/packages/react-art/src/ReactARTHostConfig.js @@ -330,6 +330,9 @@ export function getChildHostContext() { export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; +export function queueMicrotask(callback: Function) { + invariant(false, 'Not implemented.'); +} export function shouldSetTextContent(type, props) { return ( diff --git a/packages/react-dom/src/client/ReactDOMHostConfig.js b/packages/react-dom/src/client/ReactDOMHostConfig.js index 8de2f2c5c7ca4..969f6f88b02a6 100644 --- a/packages/react-dom/src/client/ReactDOMHostConfig.js +++ b/packages/react-dom/src/client/ReactDOMHostConfig.js @@ -384,6 +384,21 @@ export const scheduleTimeout: any = export const cancelTimeout: any = typeof clearTimeout === 'function' ? clearTimeout : (undefined: any); export const noTimeout = -1; +export const queueMicrotask: any = + typeof global.queueMicrotask === 'function' + ? global.queueMicrotask + : typeof Promise !== 'undefined' + ? callback => + Promise.resolve(null) + .then(callback) + .catch(handleErrorInNextTick) + : scheduleTimeout; + +function handleErrorInNextTick(error) { + setTimeout(() => { + throw error; + }); +} // ------------------- // Mutation diff --git a/packages/react-native-renderer/src/ReactFabricHostConfig.js b/packages/react-native-renderer/src/ReactFabricHostConfig.js index 636542e8d426b..7329a5f04a043 100644 --- a/packages/react-native-renderer/src/ReactFabricHostConfig.js +++ b/packages/react-native-renderer/src/ReactFabricHostConfig.js @@ -348,6 +348,9 @@ export const warnsIfNotActing = false; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; +export function queueMicrotask(callback: Function) { + invariant(false, 'Not implemented.'); +} // ------------------- // Persistence diff --git a/packages/react-native-renderer/src/ReactNativeHostConfig.js b/packages/react-native-renderer/src/ReactNativeHostConfig.js index eba0a2b90462b..5f64845f31421 100644 --- a/packages/react-native-renderer/src/ReactNativeHostConfig.js +++ b/packages/react-native-renderer/src/ReactNativeHostConfig.js @@ -247,6 +247,9 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; +export function queueMicrotask(callback: Function) { + invariant(false, 'Not implemented.'); +} export function shouldSetTextContent(type: string, props: Props): boolean { // TODO (bvaughn) Revisit this decision. diff --git a/packages/react-noop-renderer/src/createReactNoop.js b/packages/react-noop-renderer/src/createReactNoop.js index ec2a6d714b4f9..15bb2e28fb838 100644 --- a/packages/react-noop-renderer/src/createReactNoop.js +++ b/packages/react-noop-renderer/src/createReactNoop.js @@ -371,6 +371,19 @@ function createReactNoop(reconciler: Function, useMutation: boolean) { scheduleTimeout: setTimeout, cancelTimeout: clearTimeout, noTimeout: -1, + queueMicrotask: + typeof queueMicrotask === 'function' + ? queueMicrotask + : typeof Promise !== 'undefined' + ? callback => + Promise.resolve(null) + .then(callback) + .catch(error => { + setTimeout(() => { + throw error; + }); + }) + : setTimeout, prepareForCommit(): null | Object { return null; diff --git a/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js b/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js index 60e06740ad769..e195b898749f8 100644 --- a/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js +++ b/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js @@ -54,6 +54,7 @@ export const shouldSetTextContent = $$$hostConfig.shouldSetTextContent; export const createTextInstance = $$$hostConfig.createTextInstance; export const scheduleTimeout = $$$hostConfig.scheduleTimeout; export const cancelTimeout = $$$hostConfig.cancelTimeout; +export const queueMicrotask = $$$hostConfig.queueMicrotask; export const noTimeout = $$$hostConfig.noTimeout; export const now = $$$hostConfig.now; export const isPrimaryRenderer = $$$hostConfig.isPrimaryRenderer; diff --git a/packages/react-test-renderer/src/ReactTestHostConfig.js b/packages/react-test-renderer/src/ReactTestHostConfig.js index a6d661d5fe9cc..026c74bd96657 100644 --- a/packages/react-test-renderer/src/ReactTestHostConfig.js +++ b/packages/react-test-renderer/src/ReactTestHostConfig.js @@ -220,6 +220,21 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; +export const queueMicrotask = + typeof global.queueMicrotask === 'function' + ? global.queueMicrotask + : typeof Promise !== 'undefined' + ? (callback: Function) => + Promise.resolve(null) + .then(callback) + .catch(handleErrorInNextTick) + : scheduleTimeout; + +function handleErrorInNextTick(error) { + setTimeout(() => { + throw error; + }); +} export const noTimeout = -1; // -------------------