如果我的架构看起来像这样:
A {
Values: [B]
}
B {
ValueFromSubSystemX: Float
ValueFromSubSystemY: Float
}
如果客户端执行如下所示的查询:
A {
Values {
ValueFromSubSystemX
}
}
我想要ServiceX.GetAll()
,然后ServiceX.load(id)
加载缓存的数据,但我不想ServiceY.GetAll()
,因为我从未做过ServiceY.load(id)
1}}(因为客户端从未请求任何有关SystemY的信息)。
无论如何都要做这种数据加载吗?
答案 0 :(得分:0)
一个,不是那么漂亮,我发现的解决方案是在每个请求中请求所有请求,并让数据加载器跟踪我们是否应该去子系统接听电话。解决方案看起来像这样:
const resolvers = {
B: {
async ValueFromSubSystemX (root, args, context) {
await context.loaders.subSystemX.getAllValues('all')
return await context.loaders.subSystemX.valueById(root.id)
},
async ValueFromSubSystemY (root, args, context) {
await context.loaders.subSystemY.getAllValues('all')
return await context.loaders.subSystemY.valueById(root.id)
}
}
}
getAllValues
现在正在调用valueById.prime(idFromSubSystem, valueFromSubSystem)
请勿忘记关闭getAllValues
上的批量处理。如果没有禁用,您的数据加载器可能会非常慢,具体取决于您的实现方式。