import type {AsyncDispatcher} 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: AsyncDispatcher = {
getCacheForType<R>(resourceType: () => R): R {
let entry: R | void = (cache.get(resourceType): any);
if (entry === undefined) {
entry = resourceType();
cache.set(resourceType, entry);
}
return entry;
},
cacheSignal(): null {
return null;
},
getOwner(): null {
return null;
},
};
return new Promise((resolve, reject) => {
function retry() {
const prevDispatcher = ReactSharedInternals.A;
ReactSharedInternals.A = testDispatcher;
try {
const result = fn();
resolve(result);
} catch (thrownValue) {
if (typeof thrownValue.then === 'function') {
thrownValue.then(retry, retry);
} else {
reject(thrownValue);
}
} finally {
ReactSharedInternals.A = prevDispatcher;
}
}
retry();
});
}