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

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

我完全陷入了一个 Apollo 问题,为此我已经打开了一个 GitHub 问题并且在上的响应为零。

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

但出于某种原因,我的代码无法像这样工作。我收到了两个 update() 调用,都带有乐观数据。

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

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

最佳答案

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

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

解释

aws-appsync有一个名为 OfflineLink 的 ApolloLink干预 request功能。

发生的事情是这样的:

  1. 你调用$apollo.mutate(...)
  2. ApolloClient.QueryManager初始化触发你的突变 update第一次有了乐观的 react 。这发生在 ApolloClient 数据存储中,markMutationInit电话 markMutationResultcalls your update .
  3. graphql 操作执行并到达 OfflineLink在网络链中。
  4. OfflineLink创建一个新的观察者和 dispatches the mutation信息作为一项行动。
  5. 下一行OfflineLink调用观察者的 next功能与 optimisticResponse 就好像是执行结果一样!
  6. 这会触发您的 update 第二次 结果实际上是 optimisticResponse .
  7. OfflineLink调用观察者的 complete这解决了你的 promise 。
  8. console.log('done!'...

与此同时,OfflineLink甚至阻止原始突变发送请求,并生成一个新的突变并使用您给它的选项发送。

关于vue.js - Apollo - update() 方法被调用两次,两次都使用乐观/假数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48942175/

相关文章:

http - VueJS HTTP请求错误500处理

meteor - 如何将参数传递给graphql查询?

reactjs - 如何在 Apollo/GraphQL 和 React 中使用状态和 useQuery?

javascript - 如何使用 Apollo-Client 为请求设置超时

javascript - 如何将对象推送到 Vue.js 中的现有数组

javascript - 无效 Prop : type check failed for prop

javascript - GraphQL AWS Amplify @connection 未引入连接数据

reactjs - 是否安全地在客户端创建带有 token 的 cookie?

android - 未生成 Apollo 目录

javascript - 我在订单表中的 line_items 数组中有product_id,我想使用 vue.js 在 laravel 中根据此product_id 显示产品名称