有一种情况,有两种可能的类型来填充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
}
}
}
我的问题是如何在另一个字段解析器中共享该结果(除了使用"context")。或者,如果有更好的方法来处理这种情况,请告诉我。
可以选择在上下文中延迟加载该查询。每个解析器都会在上下文上调用该属性,但只有第一个解析器会实际执行该属性。