Files
react/packages/react-suspense-test-utils/src/ReactSuspenseTestUtils.js
Sebastian Markbåge d50323eb84 Flatten ReactSharedInternals (#28783)
This is similar to #28771 but for isomorphic. We need a make over for
these dispatchers anyway so this is the first step. Also helps flush out
some internals usage that will break anyway.

It flattens the inner mutable objects onto the ReactSharedInternals.
2024-04-08 19:23:23 -04:00

47 lines
1.3 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import type {CacheDispatcher} from 'react-reconciler/src/ReactInternalTypes';
import ReactSharedInternals from 'shared/ReactSharedInternals';
export function waitForSuspense<T>(fn: () => T): Promise<T> {
const cache: Map<Function, mixed> = new Map();
const testDispatcher: CacheDispatcher = {
getCacheForType<R>(resourceType: () => R): R {
let entry: R | void = (cache.get(resourceType): any);
if (entry === undefined) {
entry = resourceType();
// TODO: Warn if undefined?
cache.set(resourceType, entry);
}
return entry;
},
};
// Not using async/await because we don't compile it.
return new Promise((resolve, reject) => {
function retry() {
const prevDispatcher = ReactSharedInternals.C;
ReactSharedInternals.C = testDispatcher;
try {
const result = fn();
resolve(result);
} catch (thrownValue) {
if (typeof thrownValue.then === 'function') {
thrownValue.then(retry, retry);
} else {
reject(thrownValue);
}
} finally {
ReactSharedInternals.C = prevDispatcher;
}
}
retry();
});
}