如何累积单个请求的解析调用?
Posted
技术标签:
【中文标题】如何累积单个请求的解析调用?【英文标题】:How to accumulate resolve calls for a single request? 【发布时间】:2016-03-12 18:49:34 【问题描述】:当graphql request
访问我的服务器时,它会根据查询跳转到几个不同的resolve functions
。
但我不想有时用几十个小请求(基本上每个resolve
函数中的select
)来访问我的数据库。这不会很好地扩展。
有没有办法为单个 graphql 请求累积所有这些解析调用 - 以便最后我可以做一些魔术并在我的数据库中只构建一个 select
然后解析所有承诺?
通过累积我在解析函数中返回的所有承诺,我可以看到一些自己构建东西的方法,但我不知道何时调用了单个请求的所有解析函数。
这个问题有解决办法吗? Facebook 如何应对这种情况?
谢谢
【问题讨论】:
【参考方案1】:将所有解析调用批处理到一个单个数据库查询中是 GraphQL 实现的一个活跃探索领域,并且在参考实现中不受支持。相反,我们建议使用dataloader。使用dataloader
可以帮助确保您从存储层获取每条记录一次,即使它被多次查询。
【讨论】:
谢谢。但是我怎么知道当前的 graphql 请求已经调用了所有的解析函数呢? 你一般不会:当所有的resolve函数都被调用时,这意味着响应已经完全生成。参考实现(以及可能的大多数其他实现)使用广度优先遍历处理查询:在解析父记录之前无法解析子字段。dataloader
有助于消除对同一对象的重复请求。
谢谢。我会试一试。我目前正在使用 sequelize 和 mysql,这可能不太适合数据加载器,因为 sequelize 进行自己的实体缓存 - 但不是查询缓存。一旦我有更清晰的图片,我会在这里更新。
请注意,它不仅仅是重复数据删除:它在同一个“tick”中批量处理所有请求。请参阅自述文件:“批处理不是高级功能,而是 DataLoader 的主要功能。”以上是关于如何累积单个请求的解析调用?的主要内容,如果未能解决你的问题,请参考以下文章
(每次调用 glTranslate 在模型视图矩阵上都是累积的)这是啥意思以及如何禁用此功能?