респонсе прихоит userId который я сетаю в стейт. и есть вот такой блок на странице в котором надо отображать данные на основании имеющего в стейте userId. я закинул диспатч этой санки в useEffect. проблема в том что возникает циклическая зависимость. т.е. изначально listOfAccount и userId равны null, после того как из authMe запроса приходит userId срабатывает useEffect и запускает диспатч listOfAccounts который записывает данные в стейт, т.е. стейт меняется, что запускает useEffect ещё раз и так по кругу. как победить циклическую зависимость в данном случае? если я уберу из-зависимостей listOfAccount на странице не отображаются новые данные пока я не нажму обновить страницу.
гм... Ну типа два запроса делать надо? первым ты получаешь userId? а вторым данные по пользователю используя этот userId ? А это никак нельзя в пределах одной санки сделать? что бы логику в компоненты не выносить
А зачем listOfAccounts в зависимостях useEffect, если ты его внутри useEffect не пользуешь?
если его убрать то циклическая зависимость пропадает. но, мне надо как-то обновлять картинку на странице когда в стейте меняются данные, не обновляя саму страницу целиком. т.е. надо диспатчить эту санку если вдруг данные в стейте изменятся
Так а какую роль в этом юзефекте играет listOfAccounts, он там вообще не используется, просто вызывает лишний раз юзстейт
гм.. Второй useEffect ? с одной зависимостью в виде listOfAccounts ?
а не тоже самое разве получится? ну ща попробую конечно
ну во втором useEffect ты не будешь просто дергать dispatch(listOfAccountsTC...
так мне надо его дёргать. он жи обновляет стейт который надо отрисовать на странице
Ну это первый у тебя будет делать с зависимостью от userId а второй будет зависеть только от listOfAccounts и внутри него будешь обновлять картинку
а ну да, должно помочь, спасибо)
нифига. ловлю всё ту же циклическую зависимость((
там запрос за новыми данными. массив если обновился то надо отрисовать новые элементы
массив это listOfAccaunts ? и вчем смысл второго диспатча listOfAccauntsTC c тем же самым userId ?
смотри, есть у меня форма в которой создаётся новый аккаунт, в онсабмит, первый диспатч это регистрация нового аккаунта, после его выполнения я запускаю 2 диспатча в которых приходят массивы для разных блоков на странице.
вот пытаюсь как-то сделать чтобы новый аккаунт сразу отображался в списке на странице
Но второй useEffect ни делает у тебя сейчас ничего, кроме как зацикливает сам себя так как в listOfAccaunts у тебя каждый раз будет новый объект (а массив это объект) и справедливо что {} !== {} если только это не один и тот же объект то у тебя каждый раз второй useEffect будет срабатывать после обновления данных в listOfAccaunts при этом сам же провоцируя их изменения
ну это я вроде понял. теперь пытаюсь запросы за обновлениями массивов закинуть на кнопку создания аккаунта, чтоб после его создания, сразу запрашивались обновлённые массивы. по идее должно сработать, но судя по нетворку запросы срабатывают без очередности. или я неправильно async await написал?
ну и допустим ты запустил 2 последних диспатча, они переписали некторые значения в редаксе и ты в компонетах получил через селектор эти данные Но однако же что дальше ты пытаешь сделать?
на 100% не уверен, но можно посмотреть что вообще возвращает dispatch через console.log есть у меня сомнения что он возвращает промис а если он его не возвращает то твои await сразу отработают и ждать ответа сервера код не будет
судя из нетвока. options запросы посылаются в правильном порядке. а вот post запросы уже кто как
тут не в запросе дело, а втом, что у тебя вторая санка не ожидает окончания работы первой вообще у тебя бизнес логика сейчас просачивается в компоненты и тебе приходится делать сложное колдовство с useEffect и диспатчами, что бы хоть как-то гаранитровать послдеовательность действий если ты устранишь проникновение бизнес логики в компоненты, то у тебя проблема исчезнет сама собой
т.е. все вотэти цепочки запросов и преобразования надо делать внутри экшен крейтеров и санок?
ну санок в экшн криэторах только код для запуска санки в onSubmit у тебя по идее должен быть только ОДИН вызов нужной санки а useEffect он тебе только усложнит бизнес логику
подскажи плиз ещё такой момент, вот у меня санка создания аккаунта, в респонсе приходят только 3 вот этих поля. где мне взять userId? или засунуть туда authMe запрос который вернёт userId?
вообще если ты ниже там диспатчишь санки для запроса к серверу это несколько проблемно по идее в санке dispatch он толлько для записи уже готовых значений в стэйт редакса через экшены если ты хочешь в санке несколько других санок последовательно выполнять, то тебе прийдется в них пробрасывать колбэки для получения ответов от сервера и наверно каждый такой вызов еще и в new Promise оборачивать если не хочешь callback hell я бы наверно в твоей ситуации просто апи для доступа к серверу напрямую бы вызывал последовательно
вот так получилось сделать. работает. респект за подсказки))🤘
Обсуждают сегодня