Hier finden Sie detaillierte Informationen zum Relay-Paginierungsalgorithmus: https://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm.
Ihre spezielle Frage zu hasNextPage beantworten zu können, ist dies der Algorithmus:
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
}
Ein kurzer Hinweis auf Cursor vs Seite basiert Paginierung. Es ist im Allgemeinen eine schlechte Idee, mit festen Seitengrößen zu paginieren. Ein klassisches Beispiel hierfür ist die Verwendung des Schlüsselworts OFFSET in SQL, um die nächste Seite zu erfassen. Es gibt viele Probleme mit diesem Ansatz. Was würde zum Beispiel passieren, wenn ein neues Objekt eingefügt wurde, während Sie das Set paginieren? Wenn das neue Objekt vor der Seite eingefügt wurde, die Sie gerade erfassen, und Sie einen festen Abstand verwenden, greifen Sie ein Objekt, das Sie bereits erfasst haben, was zu doppelten Daten in Ihrer Präsentationsebene führt. Die Verwendung von Cursorn für die Paginierung behebt dieses Problem, indem Sie die Objekte selbst verfolgen können, anstatt die Objekte zu zählen.
Einmal letzte Sache mit Relais Paginierung speziell. Ich empfehle nur (vorher & nachher) ODER (zuletzt & vorher) zu jedem gegebenen Zeitpunkt. Die Verwendung beider in derselben Abfrage kann zu logischen, jedoch unerwarteten Ergebnissen führen.
Viel Glück!