有一种情况,有两种可能的类型来填充
data
属性。我为此创建了一个 union
类型(ComponentItem
)来确定需要返回哪个字段。第一个模式 (ComponentItem1
) 应该只是一个硬编码列表,但第二个模式 (ComponentItem2
) 更加动态,它从查询中获取 searchTerm
,它实际上调用端点来填充 list
,并且还具有hasNextPage
财产。
这是我制作的模式:
type Component {
id
title
data: ComponentItem
}
union ComponentItem = ComponentItem1 | ComponentItem2
type ComponentItem1 {
list: [List!]!
}
type ComponentItem2 {
hasNextPage: Boolean;
list: [List!]!
}
在解析器中,我正在解析联合类型以生成正确的
__typename
:
const resolver: {
ComponentItem: {
__resolveType(object) {
if(object.searchTerm){
return "ComponentItem2"
}
return "ComponentItem1"
},
},
}
我目前正在做的是分别解析
list
和 hasNextPage
,但在这种情况下,我将请求发送到同一端点两次。
const resolver = {
...resolver,
ComponentItem2: {
list: async (root, __, context) => {
const result = await fetch('search-endpoint')
return result?.items || []
}
hasNextPage: async (root, __, context) => {
const result = await fetch('search-endpoint')
return result?.hasNextPage || false
}
}
}
我的问题是如何在另一个字段解析器中共享该结果(除了使用“上下文”)。或者如果有更好的方法来处理这种情况请告诉我。
一种选择可能是在上下文中延迟加载该查询。每个解析器都会在上下文中调用该属性,但只有第一个解析器会实际执行它。