Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Шортхенды для вызова query после мутаций и / или других query (операторы success, failure) #472

Open
xaota opened this issue Apr 9, 2024 · 3 comments

Comments

@xaota
Copy link

xaota commented Apr 9, 2024

Часто требуется загружать данные после получения других данных или (ещё чаще) обновлять их после мутаций

Текущая реализация (даже с учетом #465) слишком многословна. А если требуется делать mapParams, то наступает полный мрак.

Идея - базовые операторы success и failure для простого описания порядка запросов

пример:

const queryFirst = createQuery(...);
const querySecond = createQuery(...);

const mutationFirst = createMutation(...);
const mutationSecond = createMutation(...);

success(queryFirst, querySecond, mapParams?) // после успеха queryFirst будет вызов querySecond (и mapParams тут же)
failure(mutationFirst, queryFirst, mapParams?) //  в случае неудачи mutationFirst надо перезапросить queryFirst

// и так далее
@igorkamyshev
Copy link
Owner

igorkamyshev commented Apr 16, 2024

Чем плоха форма

update(query, { on: mutation, by: { success: true } })

?

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

Напиши, пожалуйста RFC, в котором будут пояснения о дизайне, рассмотренные варианты дизайна, их плюсы и минусы.

https://github.com/igorkamyshev/farfetched/blob/master/CONTRIBUTING.md

@xaota
Copy link
Author

xaota commented Apr 22, 2024

update(query, { on: mutation, by: { success: true } })
  1. эта запись РЕЗКО усложняется, если требуется mapParams, например
  2. а можно сделать update(query: querySecond, on: { query: queryFirst, by: ... })? как будто бы в терминах этого оператора не очень хорошая идея

вообще идея в том что это просто шортхенд для самых частых кейсов типа
success(mutationFirst, querySecond), можно такими короткими кирпичиками описать флоу запросов, и читать очень удобно

@risen228
Copy link

Есть вот такое еще предложение

update(usersListQuery)
    .onMutationSuccess(addUserMutation)
    .setResult((list, user) => list.concat(user))

update(usersListQuery)
    .onMutationFailure(addUserMutation)
    .setError((queryError, mutationError) => mutationError)

update(usersListQuery)
    .onMutationFailure(addUserMutation)
    .doRefetch()

Про проблему часто писали в чатах, сейчас апишка тяжеловатая и внутри надо делать тайпгард у квери чтобы отсечь кейс когда у нее состояние ошибки, из-за этого код очень некрасивым и многословным становится, с конструкциями вида if ('error' in queryResult) return

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

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

Также можно добавить методы для ивентов, например:

update(userListQuery)
  .onEvent(userAdded)
  .setResult((list, user) => list.concat(user))

Есть мнение что это не совсем effector-like апишка и она должна быть объектом как во всех операторах. Но вложенность тогда выглядит неприятно и это не так удобно писать, в отличие от чейнинга

На полноценную RFC нет времени и сил, сорри

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants