а ты про то что если нам нужна кастомная обработка без дефолтной то нужно этот эффект вынести из домена?
ага, либо задуматься, действительно ли у нас эти эффекты можно объединить под доменом (например фронтенд-разработчиков нельзя объединить под доменом «использовали в жизни date-fns»)
поэтому вместо домена я и предложил явный форвард: именно эти эффекты будут пересылать ошибки в sentry
requestHandlerFx суть проблемы в этом методе. из-за того что запросы в состоянии гонки, один из них делает refresh раньше чем другой. второй в догонку шлет refreshToken, но сервер уже обновил его и валиться ошибка
ага, либо задуматься, действительно ли у нас эти эффекты можно объединить под доменом (например фронтенд-разработчиков нельзя объединить под доменом «использовали в жизни date-fns»)
поэтому вместо домена я и предложил явный форвард: именно эти эффекты будут пересылать ошибки в sentry
по идеи моя проблема с refresh токеном может быть решена, если хранить refresh в корне модуля, а не в сторе. но это же нарушение и хочется найти правильное решение по flow эффектора.
Делаете ли вы обработку ошибок эффектов домена через хук домена? Я как вижу это отличное решение для обработки стандартной ошибки при которой покажется какой-то алерт с ошибкой и отправки ошибки в сентри. А вот если на каком то эффекте нам не нужно обрабатывать дефолтную ошибку, а выполнить что то другое? https://share.effector.dev/q2O8lh4m
requestHandlerFx суть проблемы в этом методе. из-за того что запросы в состоянии гонки, один из них делает refresh раньше чем другой. второй в догонку шлет refreshToken, но сервер уже обновил его и валиться ошибка
решение можно упростить во многом, но кроме дефера) это координация на самом базовом уровне, её нельзя убрать, но можно в итоге абстрагировать — сами эффекты реализованы именно через дефер, именно потому что требуется координировать много действий по окончанию произвольного промиса
идея в том, что отдельный эффект getTokensFx с помощью апдейта $authData говорит остальной системе «всем приостановить запросы до дальнейших указаний», ну и вот defer и является таким указанием
альтернативная но тождественная идея — массив подписок на окончание — https://gist.github.com/mkjiau/650013a99c341c9f23ca00ccb213db1c refreshSubscribers — это буквально то же самое что и дефер, просто в случае с дефером мы реализуем очередь не руками, а с помощью движка, с помощью реализации промисов
а теперь, как извне колбэка промиса req сообщить всем подписчикам, что им можно начинать работать? промис оповестит всех, когда будет вызван его аргумент resolve. значит, в конечном счёте нужно вызвать resolve извне:
let resolve const req = new Promise(rs => resolve = rs)
я бы хотел это в итоге обобщить для эффектора, но пока не до конца понятно, с чем мы имеем дело (это интерсепторы? это обобщённая очередь? это что-то типа respondWith в апи сервис-воркеров?)
а понимание приходит именно во время обсуждения практических кейсов)
у меня раньше был код под aixos с интерсепторами который решал задачу по обновлению access токена. но когда я прикрутил его в итоге к эффектору, столкнулся с неприятностями и решил в что все же, лучше максимум логики вынести на уровень эффектов и стор.