Dve strategiji: na osnovi offseta (limit/offset) in na osnovi kurzorja. GraphQL nima vgrajene paginacije, a standard skupnosti je specifikacija Relay Connection, ki formalizira kurzorsko paginacijo.
Dve strategiji: na osnovi offseta (limit/offset) in na osnovi kurzorja. GraphQL nima vgrajene paginacije, a standard skupnosti je specifikacija Relay Connection, ki formalizira kurzorsko paginacijo.
items(limit: 10, offset: 20)) je preprost, a se pri živih podatkih pokvari: če se med paginacijo uporabnika vstavi vrstica, se elementi premaknejo in vidiš podvojitve ali vrzeli. Prav tako postane počasen pri globokih offsetih (baza še vedno pregleda preskočene vrstice).Connection ovije seznam v edges (vsak s cursor in node) plus 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 },
};
Kurzor je neprozoren — običajno base64 ključa za razvrščanje — tako da ga odjemalci obravnavajo kot žeton, ne kot številko.
Izbira med offset in cursor kaže, da razumeš konsistentnost pri sočasnih pisanjih in zmogljivost pri globokih straneh. Poznavanje oblike Relay connection je pomembno, ker imajo odjemalci Apollo/Relay zanjo vgrajeno obravnavo predpomnilnika.
Knjižnica IT vprašanj za razgovore s podrobnimi odgovori — od začetnika do izkušenega.
Doniraj