如何累积单个请求的解析调用?

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 的主要功能。”

以上是关于如何累积单个请求的解析调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用动态别名在单个请求中多次调用 GraphQL 突变

从http请求中 获得请求参数 应该调用哪个方法

如何从 pool.apply_async 调用中累积结果?

(每次调用 glTranslate 在模型视图矩阵上都是累积的)这是啥意思以及如何禁用此功能?

在 Node.js 中的单个 HTTP 请求中调用多个 HTTP 请求

使用GCD单个页面多个网络请求的情况(依次调用接口),等待所有网络请求结束后,再刷新UI