您可以在此处找到有关中继分页算法的详细信息:https ://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm 。
要回答您关于 hasNextPage 的具体问题,算法如下:
function hasNextPage(allEdges, before, after, first, last) {
// If first was not set, return false.
if (first === null) { return false; }
// Apply the before & after cursor arguments to the set of edges.
// i.e. edges is the set of edges between the before and after cursors
const edges = ApplyCursorsToEdges(allEdges, before, after)
// If more edges exist between the before & after cursors than
// you are asking for then there is a next page.
if (edges.length > first) { return true; }
return false
}
关于光标与基于页面的分页的快速说明。使用固定页面大小进行分页通常是个坏主意。一个典型的例子是在 SQL 中使用 OFFSET 关键字来抓取下一页。这种方法有很多问题。例如,如果在对集合进行分页时插入了一个新对象,会发生什么情况?如果新对象是在您当前抓取的页面之前插入的,并且您使用固定偏移量,您将抓取一个您已经抓取的对象,这会导致表示层中的数据重复。使用游标进行分页通过允许您跟踪对象本身而不是对象的计数来解决此问题。
曾经是最后一件事,特别是中继分页。我建议在任何给定时间只使用 (first & after) OR (last & before)。在同一个查询中同时使用两者可能会导致合乎逻辑但出乎意料的结果。
祝你好运!