Batched state changes are not flushed if the promise code changes the DOM (= attaching an iframe). Reproduceable with Safari.

React version: 18.1.0

## Steps To Reproduce

1. Open [codepen](https://codepen.io/kh-viewar/pen/wvpVLxM) with Safari.
2. Click "Upload"
3. => "Spinner" text does not render while Promise is in pending

Link to code example:

https://codepen.io/kh-viewar/pen/wvpVLxM

## The current behavior

State changes are not executed.

## The expected behavior

State should change to true and render spinner component. After promise is resolved (2 seconds timeout), state should switch back to false and spinner component should unmount.

## Original discussion

https://github.com/facebook/react/issues/24365
}
  retryTimedOutBoundary(boundaryFiber, retryLane);
}
 Computes the next Just Noticeable Difference (JND) 
 The theory is that a person can't tell the difference between small differences in time.
 Therefore, if we wait a bit longer than necessary that won't translate to a noticeable
 difference in the experience. However, waiting for longer might mean that we can avoid
 showing an intermediate loading state. The longer we have already waited, the harder it
 is to tell small differences in time. Therefore, the longer we've already waited,
 the longer we can wait additionally. At some point we have to give up though.
 We pick a train model where the next boundary commits at a consistent schedule.
 These particular numbers are vague estimates. We expect to adjust them based on research.
function jnd(timeElapsed: number) {
  return timeElapsed < 120
    ? 120
    : timeElapsed < 480
    ? 480
    : timeElapsed < 1080
    ? 1080
    : timeElapsed < 1920
    ? 1920
    : timeElapsed < 3000
    ? 3000
    : timeElapsed < 4320
    ? 4320
    : ceil(timeElapsed / 1960) * 1960;
}
function checkForNestedUpdates() {
  if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
    nestedUpdateCount = 0;