import { load } from 'dldr';// Define your loader functionconst getPosts = (keys: string[]) => sql`SELECT id, name FROM posts WHERE id IN (${keys})`;// For convenience, you can bind the loaderconst loadPost = load.bind(null, getPosts);// Build up your requestsconst posts = [ load(getPosts, '123'), loadPost('123'), // Functionally equivalent to above load(getPosts, '456'),];// Add more requestsposts.push(load(getPosts, '789'));// Batch and resolve all requestsconst loaded = await Promise.all(posts);// Your loader was called once with ['123', '456', '789']console.log(loaded);// [// { id: '123', name: '123' },// { id: '123', name: '123' },// { id: '456', name: '456' },// { id: '789', name: '789' },// ]
Use .bind() to create a convenience function that doesn’t require passing the loader every time.
Your loader function must return a value (or Error) for each key in the same order they were provided.
// ✅ Correct - returns value for each keyasync function goodLoader(keys: string[]) { const results = await db.query('SELECT * FROM users WHERE id IN (?)', [keys]); return keys.map(key => results.find(r => r.id === key) || new Error('Not found') );}// ❌ Wrong - might not return same lengthasync function badLoader(keys: string[]) { return db.query('SELECT * FROM users WHERE id IN (?)', [keys]); // Database might return fewer results than keys!}