Żewġ strateġiji: offset-based (limit/offset) u cursor-based. GraphQL m'għandux pagination built-in, imma l-istandard tal-komunità huwa l-ispeċifikazzjoni Relay Connection, li tifformalizza l-cursor pagination.
Żewġ strateġiji: offset-based (limit/offset) u cursor-based. GraphQL m'għandux pagination built-in, imma l-istandard tal-komunità huwa l-ispeċifikazzjoni Relay Connection, li tifformalizza l-cursor pagination.
items(limit: 10, offset: 20)) huwa sempliċi imma jinkiser fuq data live: jekk row jiddaħħal waqt li l-utent qed jgħaddi minn paġna għal oħra, l-items jiċċaqilqu u tara duplikati jew vojt. Isir ukoll bil-mod f'offsets fondi (id-DB xorta jiskennja r-rows li jinqabżu).Connection tgeżwer il-list f'edges (kull wieħed b'cursor u node) flimkien ma' pageInfo:
type Query {
posts(first: Int!, after: String): PostConnection! # first = page size, after = cursor
}
type PostConnection {
edges: [PostEdge!]!
pageInfo: PageInfo!
}
type PostEdge {
cursor: String! # opaque token for THIS node's position
node: Post! # the actual item
}
type PageInfo {
endCursor: String # feed this back as 'after' for the next page
hasNextPage: Boolean! # so the client knows when to stop
}
// resolver: fetch ONE extra row to compute hasNextPage cheaply
const rows = await db.posts.find({ after: args.after, limit: args.first + 1 });
const hasNextPage = rows.length > args.first;
const page = rows.slice(0, args.first);
return {
edges: page.map((p) => ({ node: p, cursor: encodeCursor(p.id) })),
pageInfo: { endCursor: page.at(-1) && encodeCursor(page.at(-1).id), hasNextPage },
};
Il-cursor huwa opaque — normalment base64 tas-sort key — allura l-klijenti jittrattawh bħala token, mhux numru.
Li tagħżel offset kontra cursor juri li tifhem il-konsistenza taħt writes konkorrenti u l-prestazzjoni tal-paġni fondi. Li tkun taf il-forma tal-Relay connection huwa importanti għax il-klijenti Apollo/Relay għandhom ġestjoni tal-cache built-in għaliha.
Librerija ta' mistoqsijiet ta' intervisti tal-IT b'tweġibiet dettaljati — minn Junior sa Senior.
Iddona