【发布时间】:2019-01-03 04:35:33
【问题描述】:
我们有两个端点(后端调用),它们返回不同但相关的数据类型 XData 和 YData。如果XData 的实例存在id 为1,那么一定有YData 的实例具有相同的id 为1。
我们为xFetcher 和yFetcher 的每种数据类型创建了一个提取器。这些提取器在我们的 GraphQL 查询中单独使用以从两个端点获取数据,但对于某些用例,我们希望使用特定 id 组合从它们两者检索到的数据,例如,1。这种组合可能不是简单的列表追加,如下例所示。
由于XData 和YData 在查询的其他部分也被单独查询,我们不能简单地将这两个解析器合并为一个,并且尽可能避免对同一个端点进行多次调用。
我为此用例创建了一个简化示例。我们如何返回一个延迟值,结合从两个 fetcher 检索到的数据?
case class Ctx()
case class XData(id: Int, a: Seq[String], b: String)
case class YData(id: Int, a: Seq[String], c: String)
case class Data(id: Int)
val xFetcher = Fetcher((ctx: Ctx, ids: Seq[Int]) => Future {
ids.map(id => XData(1, Seq.empty, "")) // Back end call to (endpoint X)
})(HasId(_.id))
val yFetcher = Fetcher((ctx: Ctx, ids: Seq[Int]) => Future {
ids.map(id => YData(1, Seq.empty, "")) // Back end call to (endpoint Y)
})(HasId(_.id))
val GData = deriveObjectType[Ctx, Data](
AddFields(
Field("a",
ListType(StringType),
resolve = ctx => getA(ctx))
)
)
def getA(ctx: Context[Ctx, Data]) = {
val id = ctx.value.id
// Here I should also get an instance of `YData` and return the
// combination of the sequences `a` in both instances (xData, yData)
val xData: XData = ??? //getDeferredXData()
val yData: YData = ??? //getDeferredYData()
val desiredOutput = xData.a ++ yData.a
// I can get `a` from one instance but not both of them together
DeferredValue({
val xData = xFetcher.defer(id)
// val yData = yFetcher.defer(id)
// How can we combine both into one deferred value?
xData
}).mapWithErrors { data => (data.a, Vector.empty) }
}
我没怎么用过桑格利亚汽酒,所以请原谅与deferred resolvers或fetchers相关的任何不清楚的信息
【问题讨论】: