mirror of
https://github.com/facebook/react.git
synced 2026-02-26 18:58:05 +00:00
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.
47 lines
1.3 KiB
JavaScript
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();
|
|
});
|
|
}
|