0

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

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

另请注意,optimisticResponse id 前面有一个“-”,以证明乐观函数运行了两次:

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?

4

2 回答 2

1

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

https://github.com/awslabs/aws-mobile-appsync-sdk-js/pull/43

https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/d26ea1ca1a8253df11dea8f11c1749e7bad8ef05

于 2018-02-27T18:21:32.597 回答
0

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

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

于 2018-02-25T00:09:19.283 回答