Extracted from https://github.com/facebook/react/issues/12643.

We're currently diff a host node in the complete phase even if it has bailed out in the begin phase. By itself, this just means we're doing a little bit more work than necessary. But it also has some observable effects. In particular, https://github.com/facebook/react/issues/13424 (which by itself would be very rare and probably not worth fixing) is made worse because we end up committing update to inputs from another component.

I have a fix for this in https://github.com/facebook/react/pull/13423. Filing this for posterity.
for (const value of flushUnitsOfWork(n)) {
        values.push(...value);
      }
      return values;
    },
    flushThrough(expected: Array<mixed>): void {
      let actual = [];
      if (expected.length !== 0) {
        
        for (const value of flushUnitsOfWork(Infinity)) {
          actual.push(...value);
          if (actual.length >= expected.length) {
            break;
          }
        }
      }
      expect(actual).toEqual(expected);
    },
    flushNextYield(): Array<mixed> {
      let actual = null;
      
      for (const value of flushUnitsOfWork(Infinity)) {
        actual = value;
        break;
      }
      return actual !== null ? actual : [];
    },
    expire(ms: number): Array<mixed> {
      ReactNoop.advanceTime(ms);
      return ReactNoop.flushExpired();