11// @flow
22
33import React , { type Node , type Element } from 'react'
4- import type { Visitor , Frame , AbstractElement } from './types'
5- import { visitChildren } from './visitor'
4+ import type { Visitor , YieldFrame , Frame , AbstractElement } from './types'
5+ import { visitChildren , resumeVisitChildren } from './visitor'
66import { getChildrenArray } from './element'
77
88import {
@@ -28,13 +28,25 @@ let prevDispatcher = ReactCurrentDispatcher.current
2828 the queue. Hence we recursively look at suspended components in
2929 this queue, wait for their promises to resolve, and continue
3030 calling visitChildren on their children. */
31- const flushFrames = ( queue : Frame [ ] , visitor : Visitor ) : Promise < void > => {
32- if ( queue . length === 0 ) {
33- return Promise . resolve ( )
31+ const updateWithFrame = (
32+ frame : Frame ,
33+ queue : Frame [ ] ,
34+ visitor : Visitor
35+ ) : Promise < void > => {
36+ if ( frame . kind === 'frame.yield' ) {
37+ const yieldFrame : YieldFrame = frame
38+
39+ return new Promise ( resolve => {
40+ setImmediate ( ( ) => {
41+ prevDispatcher = ReactCurrentDispatcher . current
42+ ReactCurrentDispatcher . current = Dispatcher
43+ resumeVisitChildren ( yieldFrame , queue , visitor )
44+ ReactCurrentDispatcher . current = prevDispatcher
45+ resolve ( )
46+ } )
47+ } )
3448 }
3549
36- const frame = queue . shift ( )
37-
3850 return frame . thenable . then ( ( ) => {
3951 prevDispatcher = ReactCurrentDispatcher . current
4052 ReactCurrentDispatcher . current = Dispatcher
@@ -55,11 +67,19 @@ const flushFrames = (queue: Frame[], visitor: Visitor): Promise<void> => {
5567 // children (which might also suspend)
5668 visitChildren ( children , queue , visitor )
5769 ReactCurrentDispatcher . current = prevDispatcher
58-
59- return flushFrames ( queue , visitor )
6070 } )
6171}
6272
73+ const flushFrames = ( queue : Frame [ ] , visitor : Visitor ) : Promise < void > => {
74+ if ( queue . length === 0 ) {
75+ return Promise . resolve ( )
76+ }
77+
78+ return updateWithFrame ( queue . shift ( ) , queue, visitor) . then ( ( ) =>
79+ flushFrames ( queue , visitor )
80+ )
81+ }
82+
6383const defaultVisitor = ( ) => { }
6484
6585const renderPrepass = ( element : Node , visitor ? : Visitor ) : Promise < void > => {
0 commit comments