Как проверить состояние и выполнить функцию после некоторой задержки в React?

Я пытаюсь выполнить функцию, если состояние не меняется, которое обновляется из-за выборки базы данных. Я имею в виду:

const [value, setValue] = useState(false)
const func = () => {
  ...
}

setTimeout(()=>{
  if (!value) {
     func()
  } else {
    // Alert.alert("Nothing!")
     funcWithoutDbOperations() // which is desired
  }
},20000)

fetchData.then(()=>setValue(true))

Но этот метод тайм-аута принимает начальное состояние константы value и выполняется в соответствии с ее начальным значением, независимо от ее значения через 20 секунд. Даже если он обновится до true.

Как я могу достичь этой цели?

Почему вы пытаетесь это сделать? Интересно, может ли это быть проблема XY.

Matt Morgan 06.03.2024 20:37

Вы не можете! React изменит значение value только при повторной визуализации компонента. Оно определяется как константа, чтобы намекнуть на такое поведение и напомнить вам, что оно не изменится. ваш предыдущий setTimeout никогда не будет иметь обновленное значение в области видимости.

James 06.03.2024 20:41

@James Нет ли способа реализовать этот сценарий в React? Я имею в виду метод тайм-аута, использующий обновленное значение, полученное из выборки данных? После ответа существует setState, поэтому не следует ли его перерисовать?

JeremyFc 06.03.2024 20:46

Вам нужно будет использовать ссылку. Вам придется проделать дополнительную работу, чтобы синхронизировать ссылку со значением состояния, но ссылка должна быть доступна внутри замыкания как самое актуальное значение ref.currentTarget

Brian Thompson 06.03.2024 21:14

Какое поведение вам нужно? получить данные, а затем вызвать func? получить данные, затем подождать 20 секунд, а затем вызвать func?

James 06.03.2024 21:17

@James В функции есть некоторые операции обновления из базы данных. Я стараюсь свести к минимуму функции чтения/обновления из базы данных, поэтому стараюсь подождать 20 секунд перед чтением/обновлением из-за ответа. Я имею в виду ожидание 20 секунд в обоих сценариях. Можете ли вы привести пример использования ref относительно состояний?

JeremyFc 07.03.2024 12:43

@BrianThompson Можете ли вы привести пример использования ref в отношении состояний? Может быть, как ответ на эту тему?

JeremyFc 07.03.2024 12:47

@JeremyFc Эта ручка отвечает на твой вопрос? codepen.io/sandstone991/pen/ExJPYgR если да, то ответьте, чтобы я мог написать вам ответ, если нет, не могли бы вы проиллюстрировать?

SandStone 07.03.2024 15:24

@SandStone Это решение блокирует все ожидающие тайм-ауты, поэтому это не то решение, которое мне нужно. Сейчас я пробую решение plsdev89: stackoverflow.com/a/78117067/20742532

JeremyFc 07.03.2024 18:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
9
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно использовать Ref.

const [value, setValue] = useState(false)
const valueRef = useRef(value)
valueRef.current = value;

const func = () => {
  ...
}

setTimeout(()=>{
  if (!valueRef.current) {
     func()
  } else {
    // Alert.alert("Nothing!")
     funcWithoutDbOperations() // which is desired
  }
},20000)

fetchData.then(()=>setValue(true))

Я не это имел в виду. Я не пытаюсь выполнить функцию после обновления состояния. Можете ли вы еще раз прочитать мой вопрос, пожалуйста?

JeremyFc 07.03.2024 12:53

@JeremyFc Вам нужно использовать Ref.

plsdev89 07.03.2024 14:48

Спасибо, это лучшее решение, чем метод очистки тайм-аута.

JeremyFc 07.03.2024 18:30

Другие вопросы по теме