Мутация с OptimisticResponse не включает данные ответа сервера во втором обновлении
Подобно этому вопросу, я обнаружил, что при использовании optimisticResponse и обновлении для мутации идентификатор, заданный в ответе сервера, неверен. Кроме того, идентификатор фактически устанавливается путем повторного запуска оптимистической функции.
В приведенной ниже мутации refetchQueries специально закомментирован. Я не хочу этим пользоваться. Я хочу управлять всем только через обновление.
Также обратите внимание, что перед идентификатором optimisticResponse добавлено "-", чтобы доказать, что оптимистическая функция запускается дважды:
id: "-" _ uuid()
,
перегласовка
graphql(MutationCreateChild, {
options: {
// refetchQueries: [{QueryAllChildren, variables: {limit: 1000}}],
update: (proxy, {data: {createChild}}) => {
const query = QueryAllChildren;
const data = proxy.readQuery({query});
data.listChildren.items.push(createChild);
proxy.writeQuery({query, data});
console.log("id: ", createChild.id);
}
},
props: props => ({
createChild: child => {
return props.mutate({
variables: child,
optimisticResponse: () => ({
createChild: {
...child,
id: "-" + uuid(),
__typename: "Child"
}
})
});
}
})
})
Выходные данные из оператора console.log:
id: -6c5c2a28-8bc1-49fe-92e1-2abade0d06ca
id: -9e0a1c9f-d9ca-4e72-88c2-064f7cc8684e
Хотя фактический запрос в консоли разработчика Chrome выглядит следующим образом:
{"data":{"createChild":{"id":"f5bd1c27-2a21-40c6-9da2-9ddc5f05fd40",__typename":"Child"}}}
Это ошибка или я неправильно обращаюсь к идентификатору в функции обновления?
2 ответа
Это известная проблема, которая сейчас исправлена. Я предполагаю, что это скоро будет выпущено в реестр npm.
https://github.com/awslabs/aws-mobile-appsync-sdk-js/pull/43
https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/d26ea1ca1a8253df11dea8f11c1749e7bad8ef05
Используя вашу настройку, я полагаю, что функция обновления вызывается дважды, и вы правы, что реальный идентификатор с сервера будет присутствовать только во второй раз. Аполлон забирает объект, с которого вы возвращаетесь optimisticResponse
и передает его в функцию обновления, чтобы ваш пользовательский интерфейс мог немедленно отображать изменения, не дожидаясь сервера. Когда ответ сервера возвращается, функция обновления вызывается снова с тем же состоянием (то есть состоянием без оптимистического результата), где вы можете повторно применить изменение с правильным значением с сервера.
Что касается того, почему второй id
список с '-' не совпадает с идентификатором, который вы видите в консоли chrome dev, я не уверен. Вы уверены, что на самом деле этот запрос совпал с этим вызовом console.log?