我们在React项目中使用apollo-client。我们在所有列表查询的顶部设置了一个游标级别。例如:
query MediaList($mediaIds: [ID!], $type: [MediaType!], $userId: ID!) {
user {
id
medias_cursor(all_medias: true, active: true, ids: $mediaIds) {
medias {
id
type
category
name
}
}
}
}
现在对于不同的MediaList查询,媒体对象可能已存在于缓存中,但是我们不能使用它来跳过网络查询。例如:
在查询medias_cursor({"all_medias":true,"active":true,"ids":["361","362","363"]})
之后,
我们已经在这里获得了三个Media
对象-(Media:361
,Media:362
,Media:363
)。
因此,当我们尝试查询medias_cursor({"all_medias":true,"active":true,"ids":["361","363"]}
时,我们应该已经在缓存中拥有了所需的一切。但是现在,阿波罗的默认行为只会通过缓存并进入网络。
我们试图添加cacheRedirects配置来解决以下问题:
const cache = new InMemoryCache({
cacheRedirects: {
User: {
medias_cursor: (_, { ids }, { getCacheKey }) => {
if (!ids) return undefined
return {
medias: map(ids, id => {
return getCacheKey({ __typename: 'Media', id: id })
})
}
},
},
},
})
我们期望cacheRedirects可以帮助我们在可用时使用缓存,但是现在无论如何它都会跳过缓存。