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
- 纱线&&纱线开发
- 在浏览器中打开,打开控制台
- 输入一些文字并按回车键
- 重复上述
- 注意控制台中有关重复键的错误。发生这种情况是因为临时 ID“??”没有被真正的 UUID 取代
(可选)如果可用,您可以打开 Vue DevTools 并检查数据以查看它是否正确
我正在做一些挖掘,我想我找到了问题的根源。
不幸的是,我没有解决方案。
简而言之,问题可能出在名为 OfflineLink
的网络 link 上,该网络被 aws-appsync
使用。
说明
aws-appsync
有一个名为 OfflineLink
的 ApolloLink 干预 request
函数。
发生的事情是这样的:
- 你打电话给
$apollo.mutate(...)
ApolloClient.QueryManager
用乐观的响应初始化第一次触发你的 update
的突变。这发生在 ApolloClient 数据存储中,markMutationInit calls markMutationResult that calls your update.
- graphql 操作执行并到达网络链中的
OfflineLink
。
OfflineLink
创建一个新的观察者和 dispatches the mutation 信息作为一个动作。
- 下一行
OfflineLink
用optimisticResponse
调用观察者的next
函数就好像是执行结果一样!
- 这会触发您的
update
第二次 结果实际上是 optimisticResponse
.
OfflineLink
调用观察者的 complete
来解决你的承诺。
console.log('done!'...
与此同时,OfflineLink
甚至会阻止原始突变发送请求,并生成一个新的突变并使用您提供的选项发送。
我完全陷入了一个 Apollo 问题,为此我已经打开了一个 GitHub 问题并且在上的响应为零。
我正在调用 Apollo 突变,使用 optimisticResponse
。据我了解,它应该工作的方式是 update()
被调用两次:首先是乐观数据,然后是来自网络的实际数据。
但出于某种原因,我的代码无法正常工作。我接到了两个 update()
电话,都带有乐观数据。
这是一个演示此行为的代码库:https://github.com/ffxsam/apollo-update-bug
- 纱线&&纱线开发
- 在浏览器中打开,打开控制台
- 输入一些文字并按回车键
- 重复上述
- 注意控制台中有关重复键的错误。发生这种情况是因为临时 ID“??”没有被真正的 UUID 取代 (可选)如果可用,您可以打开 Vue DevTools 并检查数据以查看它是否正确
我正在做一些挖掘,我想我找到了问题的根源。 不幸的是,我没有解决方案。
简而言之,问题可能出在名为 OfflineLink
的网络 link 上,该网络被 aws-appsync
使用。
说明
aws-appsync
有一个名为 OfflineLink
的 ApolloLink 干预 request
函数。
发生的事情是这样的:
- 你打电话给
$apollo.mutate(...)
ApolloClient.QueryManager
用乐观的响应初始化第一次触发你的update
的突变。这发生在 ApolloClient 数据存储中,markMutationInit calls markMutationResult that calls your update.- graphql 操作执行并到达网络链中的
OfflineLink
。 OfflineLink
创建一个新的观察者和 dispatches the mutation 信息作为一个动作。- 下一行
OfflineLink
用optimisticResponse
调用观察者的next
函数就好像是执行结果一样! - 这会触发您的
update
第二次 结果实际上是optimisticResponse
. OfflineLink
调用观察者的complete
来解决你的承诺。console.log('done!'...
与此同时,OfflineLink
甚至会阻止原始突变发送请求,并生成一个新的突变并使用您提供的选项发送。