#javascript #reactjs #graphql #apollo #optimistic
#javascript #reactjs #graphql #apollo #оптимистичный
Вопрос:
Я пытаюсь добиться оптимистичных обновлений с помощью клиента Apollo.
У меня уже есть это, работающее в разных местах приложения, однако здесь я сталкиваюсь со стеной.
Я запускаю
store.writeQuery({query, variables, data});
в рамках обратного вызова с update
мутацией, и я попытался store.read
это сделать, это работает нормально. Однако мне не удается получить эти данные из чего-то другого в приложении.
Данные, которые я записываю в кэш, это:
{
playlist: {
__typename: 'Playlist',
elements: [{
__typename: 'Element',
id: 'test',
rating: 3,
}],
},
},
Однако в компоненте, где я хочу использовать эти кэшированные данные, мой запрос намного сложнее, и я извлекаю намного больше полей. Не только это, но я также ожидаю, что большая часть playlist.elements
будет извлечена из сети, только этот конкретный, который, как я ожидаю, будет поступать из кэша.
Можно ли получить только элемент с id: 'test
обновленным, а остальные обычно обновляются из сети? В настоящее время я получаю данные только из сети, и эти записанные в кэш данные, похоже, не влияют на результат моего запроса.
Спасибо 🙂
Комментарии:
1. Оптимистичные обновления обычно выполняются путем возврата
optimisticResponse
, нет? Похоже, вы постоянно записываете данные в хранилище. Возможно, также использованиеwriteFragment
может помочь, если вы просто обновляете один элемент. Документацию можно найти здесь2. @Herku К сожалению, использование
optimisticResponse
здесь не вариант, поскольку я возвращаю не те данные, которые мне нужны в кэше из mutation, а логическое значение (success: boolean
в значительной степени). Не вдаваясь в подробности реализации, мне нужно будет обновить кэш и прочитать из него. Действительно, я проверил документы, но использование фрагмента не помогло, данные все еще были полностью извлечены с сервера (или пусты, если использоватьcache-first
fetchPolicy.3. Являетесь ли вы владельцем реализации GraphQL (в смысле, вы можете ее изменить)? Потому что это кажется не очень документальным. Также я больше не уверен, говорим ли мы об оптимистичном ответе (оптимистичный означает, что он действует как заполнитель, пока не появится реальный результат). Возможно, вы недопонимаете довольно много вещей о GraphQL. Лучшим местом для начала было бы прочитать всю страницу, на которую я ссылался.
4. Вся идея (оптимистично) обновления кэша заключается в том, что вы (вручную) синхронизируете состояние с сервером. Вот почему я не понимаю, почему получение «всех данных с сервера» является проблемой. Я думаю, вы упускаете что-то еще, и это трудно сказать без дополнительного кода.
5. В основном это связано с GraphQL API. Короче говоря, это оболочка над REST API, и в ней не так много свободы, как это было бы возможно с полностью GraphQL API. С учетом сказанного,
writeFragment
иreadFragment
сработало. Такое ощущение, что я каким-то образом изобрел колесо здесь, поэтому я все равно буду искать более оптимальное решение, но, насколько я понимаю, вопрос решаем 🙂