Кэш Apollo — частично считывается из кэша?

#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 сработало. Такое ощущение, что я каким-то образом изобрел колесо здесь, поэтому я все равно буду искать более оптимальное решение, но, насколько я понимаю, вопрос решаем 🙂