Skip to content

Bug: SuspenseList crash #20932

Closed
Closed
@gaearon

Description

@gaearon

https://codesandbox.io/s/nostalgic-frost-53gys?file=/src/App.js

import * as React from "react";

function S(props) {
  return <React.Suspense {...props} />;
}

export default function App() {
  return (
    <React.unstable_SuspenseList revealOrder="forwards">
      <S fallback={null}>
        <Bad />
      </S>
      <S fallback={null}>
        <h1>wow</h1>
      </S>
    </React.unstable_SuspenseList>
  );
}

function Bad() {
  const [c, setC] = React.useState(0);
  read(c);
  const r = React.useRef(true);
  React.useEffect(() => {
    if (r.current) {
      r.current = false;
      setC((x) => x + 1);
    }
  }, [c]);
  return <h2>wow</h2>;
}

const cache = {};
function read(i) {
  if (cache[i]) {
    if (cache[i].result) {
      return cache[i].result;
    } else {
      throw cache[i].promise;
    }
  }
  cache[i] = {
    promise: new Promise((resolve) => {
      setTimeout(() => {
        cache[i].result = "foo";
        resolve();
      }, 1000);
    })
  };
  throw cache[i].promise;
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions