Apollo - update()方法被调用两次,两次都是乐观/假数据

时间:2018-02-23 06:13:24

标签: vue.js graphql apollo aws-appsync vue-apollo

我完全陷入了阿波罗问题,为此我打开了一个GitHub问题并且没有响应。

我正在使用optimisticResponse调用Apollo变异。据我所知,它应该工作的方式是update()被调用两次:首先是乐观数据,然后是实际数据来自网络。

但由于某种原因,我的代码不是这样的。我收到两个update()次调用,两者都是乐观数据。

这是一个演示此行为的回购:https://github.com/ffxsam/apollo-update-bug

  1. 纱线&&纱线开发
  2. 在浏览器中打开,打开控制台
  3. 输入一些文字,然后按Enter键
  4. 重复以上
  5. 请注意控制台中有关重复键的错误。发生这种情况是因为临时ID“??”没有被真正的UUID取代 (可选)您可以打开Vue DevTools(如果可用)并检查数据以查看它是否不正确

1 个答案:

答案 0 :(得分:19)

我正在做一些挖掘,我想我找到了问题的根源。 不幸的是,我没有解决方案。

简而言之,问题可能出在OfflineLink使用的名为aws-appsync的网络链接上。

说明

aws-appsync有一个名为OfflineLink的ApolloLink,它干预request函数。

发生的事情是这样的:

  1. 您致电$apollo.mutate(...)
  2. ApolloClient.QueryManager使用乐观响应初始化第一次触发update的变异。这种情况发生在ApolloClient数据存储中,markMutationInit调用markMutationResult calls your update。{/ li>
  3. graphql操作执行并到达网络链中的OfflineLink
  4. OfflineLink创建一个新的观察者,并将dispatches the mutation信息作为操作。
  5. 下一行OfflineLink使用next 调用观察者的optimisticResponse函数,就好像它是执行结果一样!
  6. 这会触发update 第二次,其结果实际上是optimisticResponse
  7. OfflineLink致电观察员complete,以解决您的承诺。
  8. console.log('done!'...
  9. 与此同时,OfflineLink可以防止原始变异发送请求,并生成新的变异并与您提供的选项一起发送。