Skip to content

Commit 82cd764

Browse files
committed
Fix two event loop yields in a row
1 parent bb13db6 commit 82cd764

File tree

2 files changed

+42
-17
lines changed

2 files changed

+42
-17
lines changed

src/__tests__/suspense.test.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe('renderPrepass', () => {
1818

1919
const Outer = () => {
2020
const start = Date.now()
21-
while (Date.now() - start < 21) {}
21+
while (Date.now() - start < 40) {}
2222
return <Inner />
2323
}
2424

@@ -45,10 +45,10 @@ describe('renderPrepass', () => {
4545
return null
4646
}
4747

48-
const Wait = () => {
48+
const Wait = props => {
4949
const start = Date.now()
5050
while (Date.now() - start < 21) {}
51-
return <Inner />
51+
return props.children
5252
}
5353

5454
class Outer extends Component {
@@ -57,7 +57,13 @@ describe('renderPrepass', () => {
5757
}
5858

5959
render() {
60-
return <Wait />
60+
return (
61+
<Wait>
62+
<Wait>
63+
<Inner />
64+
</Wait>
65+
</Wait>
66+
)
6167
}
6268
}
6369

src/visitor.js

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,29 @@ const visitLoop = (
196196
restoreContextMap(traversalMap.pop())
197197
restoreContextStore(traversalStore.pop())
198198
}
199-
}
200199

201-
if (Date.now() - start > YIELD_AFTER_MS) {
202-
return true
200+
if (Date.now() - start > YIELD_AFTER_MS) {
201+
return true
202+
}
203203
}
204204

205205
return false
206206
}
207207

208+
const makeYieldFrame = (
209+
traversalChildren: AbstractElement[][],
210+
traversalMap: Array<void | ContextMap>,
211+
traversalStore: Array<void | ContextEntry>
212+
): Frame => ({
213+
contextMap: getCurrentContextMap(),
214+
contextStore: getCurrentContextStore(),
215+
thenable: Promise.resolve(),
216+
kind: 'frame.yield',
217+
children: traversalChildren,
218+
map: traversalMap,
219+
store: traversalStore
220+
})
221+
208222
export const visitChildren = (
209223
init: AbstractElement[],
210224
queue: Frame[],
@@ -213,6 +227,7 @@ export const visitChildren = (
213227
const traversalChildren: AbstractElement[][] = [init]
214228
const traversalMap: Array<void | ContextMap> = [flushPrevContextMap()]
215229
const traversalStore: Array<void | ContextEntry> = [flushPrevContextStore()]
230+
216231
const hasYielded = visitLoop(
217232
traversalChildren,
218233
traversalMap,
@@ -222,15 +237,9 @@ export const visitChildren = (
222237
)
223238

224239
if (hasYielded) {
225-
queue.unshift({
226-
contextMap: getCurrentContextMap(),
227-
contextStore: getCurrentContextStore(),
228-
thenable: Promise.resolve(),
229-
kind: 'frame.yield',
230-
children: traversalChildren,
231-
map: traversalMap,
232-
store: traversalStore
233-
})
240+
queue.unshift(
241+
makeYieldFrame(traversalChildren, traversalMap, traversalStore)
242+
)
234243
}
235244
}
236245

@@ -243,5 +252,15 @@ export const resumeVisitChildren = (
243252
setCurrentContextMap(frame.contextMap)
244253
setCurrentContextStore(frame.contextStore)
245254

246-
visitLoop(frame.children, frame.map, frame.store, queue, visitor)
255+
const hasYielded = visitLoop(
256+
frame.children,
257+
frame.map,
258+
frame.store,
259+
queue,
260+
visitor
261+
)
262+
263+
if (hasYielded) {
264+
queue.unshift(makeYieldFrame(frame.children, frame.map, frame.store))
265+
}
247266
}

0 commit comments

Comments
 (0)