169 похожих чатов

Привет всем! Такая ситуация немного неординарная, не могу решить. Помогите

пожалуйста.
У меня есть фукнция, котору я записал как колбэк для определенного события (ещё на этапе монтирования компонента). Внутри этой функции я обращаюсь к значению стейта (которое конечно же с момента первого монтирования изменилось несколько раз), а в ней это значение ещё старое.

Как решение увидел -
передавать колбэк на setState((actualStateData) => какие-то действия тут и возвращаем новый стайт). Все работает как нужно, данные актуальные всегда обрабатываются и возвращаем уже новые, измененные значения. Но вот есть момент - одна из этапов обработки данных это дождаться выполнения запроса (асинхронного) и затем добавить в новый стейт полученные значения. Значит надо делать функцию асинхронной. Прописываю так - setState(async (actualState) => actions here). А у меня начинают ругатся другие компоненты, зависащие от этого стейта - что он имеет неправильное значение. Выводя в консоль - я вижу что возвращаются почему-то Promise всегда, хотя я даже могу не менять значение стейта и просто внутри этой функции вернуть то же самое - это уже будет промис, а не объект.

Как мне правильно получить актуальное значение стейта, выполнить запрос (который возвращает промис) дождавшись его и затем вернуть уже все вместе как новое значение стейта?

8 ответов

7 просмотров

ничего не понял, лучше кодом. зачем передавать колбек в setState? нельзя просто вычислить то, что нужно и потом сделать setState(newValue)?

Почему в функции старые значения стейта, это надо код посмотреть, как так написано. Покажи код плиз Почему промис — async функция возвращает промис. Надо setState вызвать уже после разрешения промиса, имея готовое пришедшее значение.

🖥 Eugene- Автор вопроса

router.events.on("routeChangeComplete", chatUrlIsChanged); - вот так передаётся функция, которую потом вызывает это событие. И внутри уже она не имеет доступа к актуальному стейту. А имеет те значения, которые были в стейте на момент передачи этой функции. Единственный способ узнать самый актуальный стейт (чтобы и конфликтов не было) - это я решил что вызов функции setState с параметрами (где будет актуальное значение). Поскольку мне надо это значение поменять, а не просто новое присвоить.

Использовать setState(val => newVal) в данном случае нельзя. Нужно использовать стандартный вариант

Так категорически нельзя делать. Функция, которая передается в setState должна быть чистой

🖥 Eugene- Автор вопроса

забыл уточнить - я использую только хуки. Эта функци устанавливает значение только одного стейта, не глобально всех.

А покажи "момент передачи значений этой функции". Ну или как она сама создаётся

что если колбэк функцию обернуть в useCallback?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта