Apollo - update() 方法被调用两次,两次都使用 optimistic/fake 数据

Apollo - update() method getting called twice, both times with optimistic/fake data

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

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

但出于某种原因,我的代码无法正常工作。我接到了两个 update() 电话,都带有乐观数据。

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

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

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

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

说明

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

发生的事情是这样的:

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

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