Обновление массива во время использования таймера - PullRequest
0 голосов
/ 09 июля 2020

У меня проблемы с головой при обновлении массива во время таймера в хуке useEffect:

    const [data, setData] = useState(0)
    const [priceList, setPriceList] = useState([])
    const [profit, setProfit] = useState(0)


    useEffect(() => {
        let value = 1000

        const update_value = () => {
            if (Math.random() >= 0.5 || value - Math.floor(Math.random() * 500) + 100 < 0) {
                return value += Math.floor(Math.random() * 500) + 100
            }
            return value -= Math.floor(Math.random() * 500) + 100
        }

        const price_fluctuation = (d) => {
            if (priceList.length < 2) {
                setPriceList([d, ...priceList])
                return d
            } else {
                let oldList = [...priceList]
                oldList.pop()
                setPriceList([d, ...oldList])
                return d - priceList[1]
            }
        }

        const timer = () => {
            let totalTimer = (5 * 60 + 1) * 1000
            let timerId = setInterval(
                () => {
                    const current_price = update_value()
                    setData(current_price)
                    setProfit(price_fluctuation(current_price))

                }, 5000);

            setTimeout(() => { clearInterval(timerId); }, totalTimer);
        }
        timer()

    }, [])

Функция price_fluctuation принимает текущую цену и добавляет ее в массив, который затем устанавливается на priceList. Функция предназначена для хранения не более двух цен: текущей и предыдущей. Однако priceList никогда не устанавливается во время таймера, я считаю, что это потому, что priceList всегда инициализируется пустым массивом.

Что я могу сделать, чтобы моя функция работала должным образом во время таймера. Кажется, я что-то неправильно понимаю.

...