Мутация с 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?

Другие вопросы по тегам