Reactjs 乐观反应突变不';t在第二次更新中不包括服务器响应数据

Reactjs 乐观反应突变不';t在第二次更新中不包括服务器响应数据,reactjs,graphql,react-apollo,aws-appsync,Reactjs,Graphql,React Apollo,Aws Appsync,与我发现的问题类似,当使用optimisticResponse和update进行突变时,服务器响应中设置的id是错误的。此外,id实际上是通过再次运行乐观函数来设置的 在下面的变体中,refetchQueries是故意注释掉的。我不想用那个。我只想通过更新来管理一切 还要注意optimisticResponse id前面有一个“-”,以证明optimistic函数运行了两次: id:“-”\uuid() 突变 graphql(MutationCreateChild, { options:

与我发现的问题类似,当使用optimisticResponse和update进行突变时,服务器响应中设置的id是错误的。此外,id实际上是通过再次运行乐观函数来设置的

在下面的变体中,refetchQueries是故意注释掉的。我不想用那个。我只想通过更新来管理一切

还要注意optimisticResponse id前面有一个“-”,以证明optimistic函数运行了两次:

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"}}}

这是一个错误还是我没有在更新功能中正确访问id?

使用您的设置,我相信两次调用更新功能是正常的,您是正确的,来自服务器的真实id只会在第二次出现。Apollo获取您从
optimisticResponse
返回的对象,并将其传递给更新功能,以便您的UI可以立即显示更改,而无需等待服务器。当服务器响应返回时,将使用相同的状态(即没有乐观结果的状态)再次调用update函数,您可以使用服务器的正确值重新应用更改


至于为什么您列出的带有“-”的第二个
id
与您在chrome开发控制台中看到的id不同,我不确定。您确定实际上是该请求与对console.log的调用相匹配吗?

这是一个已知问题,现已修复。我想它很快就会被发布到npm注册中心


谢谢你的解释,是的,你所描述的正是我所期望的。问题在于,对update函数的第二次调用实际上并不包括来自服务器的响应,而是在乐观响应中创建的同一个对象。我可以证实这种情况,因为进行“更新变异”而不是“创建变异”的工作方式是相同的。“创建变异”中id不同的原因是第二次调用uuid()函数。关闭并合并: