Skip to content

Commit c334f20

Browse files
committed
Set async dispatchers during module init
1 parent 7b885f1 commit c334f20

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

packages/react-server/src/ReactFlightServer.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ const {
395395
TaintRegistryPendingRequests,
396396
} = ReactSharedInternals;
397397

398+
ReactSharedInternals.A = DefaultAsyncDispatcher;
399+
398400
function throwTaintViolation(message: string) {
399401
// eslint-disable-next-line react-internal/prod-error-codes
400402
throw new Error(message);
@@ -448,11 +450,6 @@ function RequestInstance(
448450
onAllReady: () => void,
449451
onFatalError: (error: mixed) => void,
450452
) {
451-
const previousAsyncDispatcher = ReactSharedInternals.A;
452-
if (previousAsyncDispatcher === null) {
453-
ReactSharedInternals.A = DefaultAsyncDispatcher;
454-
}
455-
456453
if (__DEV__) {
457454
// Unlike Fizz or Fiber, we don't reset this and just keep it on permanently.
458455
// This lets it act more like the AsyncDispatcher so that we can get the

packages/react-server/src/flight/ReactFlightAsyncDispatcher.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ import type {ReactComponentInfo} from 'shared/ReactTypes';
1212
import type {AsyncDispatcher} from 'react-reconciler/src/ReactInternalTypes';
1313

1414
import {resolveRequest, getCache} from '../ReactFlightServer';
15+
import ReactSharedInternals from '../ReactSharedInternalsServer';
1516

1617
import {disableStringRefs} from 'shared/ReactFeatureFlags';
1718

1819
import {resolveOwner} from './ReactFlightCurrentOwner';
1920

21+
const previousAsyncDispatcher = ReactSharedInternals.A;
22+
2023
function resolveCache(): Map<Function, mixed> {
2124
const request = resolveRequest();
2225
if (request) {
@@ -30,9 +33,19 @@ export const DefaultAsyncDispatcher: AsyncDispatcher = ({
3033
const cache = resolveCache();
3134
let entry: T | void = (cache.get(resourceType): any);
3235
if (entry === undefined) {
33-
entry = resourceType();
34-
// TODO: Warn if undefined?
35-
cache.set(resourceType, entry);
36+
const chainedEntry: T | void =
37+
previousAsyncDispatcher !== null
38+
? previousAsyncDispatcher.getCacheForType(resourceType)
39+
: undefined;
40+
41+
if (chainedEntry !== undefined) {
42+
entry = chainedEntry;
43+
cache.set(resourceType, chainedEntry);
44+
} else {
45+
entry = resourceType();
46+
// TODO: Warn if undefined?
47+
cache.set(resourceType, entry);
48+
}
3649
}
3750
return entry;
3851
},

0 commit comments

Comments
 (0)