Truy vấn danh sách 50 bài viết kèm tác giả sinh ra 51 lời gọi database: một lời gọi lấy danh sách, rồi resolver của field tác giả chạy riêng cho từng bài.
// created per request — a module-scope loader leaks data between users
const userLoader = new DataLoader((ids) => usersByIds(ids))
// usersByIds MUST return rows in the same order as ids, nulls for misses
const resolvers = { Post: { author: (p, _a, ctx) => ctx.userLoader.load(p.authorId) } }Cách xử lý chuẩn là DataLoader: hoãn các yêu cầu lẻ trong cùng một tick của event loop, gom thành một danh sách khoá, rồi gọi một lần duy nhất. Nó cũng cache theo khoá trong phạm vi một yêu cầu nên cùng một tác giả không bị lấy hai lần.
Hai điều kiện quan trọng: DataLoader phải được tạo mới cho mỗi yêu cầu vì cache của nó có thể rò dữ liệu giữa các người dùng; và hàm lấy theo lô phải trả kết quả đúng thứ tự với danh sách khoá nhận vào.
Một chi tiết dễ sai: DataLoader chỉ gom được các lời gọi trong cùng một tick. Nếu resolver chờ một thao tác khác trước khi gọi DataLoader, lời gọi rơi sang tick sau và lợi ích biến mất mà không có dấu hiệu gì.