Переменная состояния реакции не обновляется в функции обратного вызова от IntersectionObserver

#reactjs #react-hooks #use-state

Вопрос:

Я пытаюсь создать функцию бесконечной прокрутки с помощью IntersectionObserver. Когда вызывается обратный вызов, я провожу тест, чтобы увидеть, происходит ли какая-то загрузка, и если да, то я хочу отменить этот новый вызов. Функция заключается в том, что:

 const loadMore = useCallback(() => {    
    if (loading) {
      return
    } 

    setLoading(true);
    
    console.log('Loading');
    setTimeout(() => {
      console.log('Finished');
      setLoading(false);
    }, 5000); 
  }, []);
 

Проблема в том, что когда наблюдатель loadMore снова вызывает, и в этот момент происходит загрузка, loading состояние иногда имеет старое значение (false), и setTimeout вызывается снова, даже если выполняется другой. Если я помещаю loading в массив зависимостей, функция вызывается много раз (в цикле), потому что я изменяю ее значение внутри нее. Я попытался использовать имя пользователя для управления загрузкой, оно работает в функции, но я также хочу использовать loading укажите в JSX, показывать или нет текст, но с переменной useRef это не работает в JSX, и я нахожу немного некрасивым использовать две переменные для управления почти одним и тем же. Есть ли способ сделать это только с государством?

Код наблюдателя:

 useEffect(() => {
    const options = {
      root: null,
      rootMargin: '10px',
      threshold: 1.0
    }

    const observer = new IntersectionObserver(loadMore, options);

    if (loaderRef amp;amp; loaderRef.current) {
      observer.observe(loaderRef.current);
    }
  }, [loadMore]);