( baseState: State, pendingUpdate: Update<State> | null, renderLane: Lane, onSkipUpdate?: <State>(update: Update<State>) => void )
| 81 | } |
| 82 | |
| 83 | export const processUpdateQueue = <State>( |
| 84 | baseState: State, |
| 85 | pendingUpdate: Update<State> | null, |
| 86 | renderLane: Lane, |
| 87 | onSkipUpdate?: <State>(update: Update<State>) => void |
| 88 | ): { |
| 89 | memoizedState: State; |
| 90 | baseState: State; |
| 91 | baseQueue: Update<State> | null; |
| 92 | } => { |
| 93 | const result: ReturnType<typeof processUpdateQueue<State>> = { |
| 94 | memoizedState: baseState, |
| 95 | baseState, |
| 96 | baseQueue: null |
| 97 | }; |
| 98 | |
| 99 | if (pendingUpdate !== null) { |
| 100 | // 第一个update |
| 101 | const first = pendingUpdate.next; |
| 102 | let pending = pendingUpdate.next as Update<any>; |
| 103 | |
| 104 | let newBaseState = baseState; |
| 105 | let newBaseQueueFirst: Update<State> | null = null; |
| 106 | let newBaseQueueLast: Update<State> | null = null; |
| 107 | let newState = baseState; |
| 108 | |
| 109 | do { |
| 110 | const updateLane = pending.lane; |
| 111 | if (!isSubsetOfLanes(renderLane, updateLane)) { |
| 112 | // 优先级不够 被跳过 |
| 113 | const clone = createUpdate(pending.action, pending.lane); |
| 114 | |
| 115 | onSkipUpdate?.(clone); |
| 116 | |
| 117 | // 是不是第一个被跳过的 |
| 118 | if (newBaseQueueFirst === null) { |
| 119 | // first u0 last = u0 |
| 120 | newBaseQueueFirst = clone; |
| 121 | newBaseQueueLast = clone; |
| 122 | newBaseState = newState; |
| 123 | } else { |
| 124 | // first u0 -> u1 -> u2 |
| 125 | // last u2 |
| 126 | (newBaseQueueLast as Update<State>).next = clone; |
| 127 | newBaseQueueLast = clone; |
| 128 | } |
| 129 | } else { |
| 130 | // 优先级足够 |
| 131 | if (newBaseQueueLast !== null) { |
| 132 | const clone = createUpdate(pending.action, NoLane); |
| 133 | newBaseQueueLast.next = clone; |
| 134 | newBaseQueueLast = clone; |
| 135 | } |
| 136 | |
| 137 | const action = pending.action; |
| 138 | if (pending.hasEagerState) { |
| 139 | newState = pending.eagerState; |
| 140 | } else { |
no test coverage detected