@@ -53,9 +53,9 @@ Batching is not an advanced feature, it's DataLoader's primary feature.
53
53
Create loaders by providing a batch loading function.
54
54
55
55
``` js
56
- var DataLoader = require (' dataloader' )
56
+ const DataLoader = require (' dataloader' )
57
57
58
- var userLoader = new DataLoader (keys => myBatchGetUsers (keys));
58
+ const userLoader = new DataLoader (keys => myBatchGetUsers (keys))
59
59
```
60
60
61
61
A batch loading function accepts an Array of keys, and returns a Promise which
@@ -66,14 +66,14 @@ individual loads which occur within a single frame of execution (a single tick
66
66
of the event loop) and then call your batch function with all requested keys.
67
67
68
68
``` js
69
- userLoader .load (1 )
70
- . then ( user => userLoader .load (user .invitedByID ) )
71
- . then ( invitedBy => console .log (` User 1 was invited by ${ invitedBy} ` ));
69
+ const user = await userLoader .load (1 )
70
+ const invitedBy = await userLoader .load (user .invitedByID )
71
+ console .log (` User 1 was invited by ${ invitedBy} ` )
72
72
73
73
// Elsewhere in your application
74
- userLoader .load (2 )
75
- . then ( user => userLoader .load (user .lastInvitedID ) )
76
- . then ( lastInvited => console .log (` User 2 last invited ${ lastInvited} ` ));
74
+ const user = await userLoader .load (2 )
75
+ const lastInvited = await userLoader .load (user .lastInvitedID )
76
+ console .log (` User 2 last invited ${ lastInvited} ` )
77
77
```
78
78
79
79
A naive application may have issued four round-trips to a backend for the
@@ -144,9 +144,9 @@ In addition to relieving pressure on your data storage, caching results per-requ
144
144
also creates fewer objects which may relieve memory pressure on your application:
145
145
146
146
``` js
147
- var userLoader = new DataLoader (... )
148
- var promise1A = userLoader .load (1 )
149
- var promise1B = userLoader .load (1 )
147
+ const userLoader = new DataLoader (... )
148
+ const promise1A = userLoader .load (1 )
149
+ const promise1B = userLoader .load (1 )
150
150
assert (promise1A === promise1B)
151
151
```
152
152
@@ -172,11 +172,11 @@ function createLoaders(authToken) {
172
172
}
173
173
}
174
174
175
- var app = express ()
175
+ const app = express ()
176
176
177
177
app .get (' /' , function (req , res ) {
178
- var authToken = authenticateUser (req)
179
- var loaders = createLoaders (authToken)
178
+ const authToken = authenticateUser (req)
179
+ const loaders = createLoaders (authToken)
180
180
res .send (renderPage (req, loaders))
181
181
})
182
182
@@ -195,18 +195,17 @@ Here's a simple example using SQL UPDATE to illustrate.
195
195
196
196
``` js
197
197
// Request begins...
198
- var userLoader = new DataLoader (... )
198
+ const userLoader = new DataLoader (... )
199
199
200
200
// And a value happens to be loaded (and cached).
201
- userLoader .load (4 ). then ( ... )
201
+ const user = await userLoader .load (4 )
202
202
203
203
// A mutation occurs, invalidating what might be in cache.
204
- sqlRun (' UPDATE users WHERE id=4 SET username="zuck"' ).then (
205
- () => userLoader .clear (4 )
206
- )
204
+ await sqlRun (' UPDATE users WHERE id=4 SET username="zuck"' )
205
+ userLoader .clear (4 )
207
206
208
207
// Later the value load is loaded again so the mutated data appears.
209
- userLoader .load (4 ). then ( ... )
208
+ const user = await userLoader .load (4 )
210
209
211
210
// Request completes.
212
211
```
@@ -221,12 +220,14 @@ be cached to avoid frequently loading the same `Error`.
221
220
In some circumstances you may wish to clear the cache for these individual Errors:
222
221
223
222
``` js
224
- userLoader .load (1 ).catch (error => {
225
- if (/* determine if should clear error */ ) {
226
- userLoader .clear (1 );
223
+ try {
224
+ const user = await userLoader .load (1 )
225
+ } catch (error) {
226
+ if (/* determine if the error should not be cached */ ) {
227
+ userLoader .clear (1 )
227
228
}
228
- throw error;
229
- });
229
+ throw error
230
+ }
230
231
```
231
232
232
233
#### Disabling Cache
@@ -244,7 +245,7 @@ for each instance of the requested key.
244
245
For example:
245
246
246
247
``` js
247
- var myLoader = new DataLoader (keys => {
248
+ const myLoader = new DataLoader (keys => {
248
249
console .log (keys)
249
250
return someBatchLoadFn (keys)
250
251
}, { cache: false })
@@ -263,7 +264,7 @@ enabled, but will immediately clear its cache when the batch function is called
263
264
so later requests will load new values.
264
265
265
266
``` js
266
- var myLoader = new DataLoader (keys => {
267
+ const myLoader = new DataLoader (keys => {
267
268
identityLoader .clearAll ()
268
269
return someBatchLoadFn (keys)
269
270
})
@@ -310,16 +311,16 @@ Loads a key, returning a `Promise` for the value represented by that key.
310
311
Loads multiple keys, promising an array of values:
311
312
312
313
``` js
313
- var [ a, b ] = await myLoader .loadMany ([ ' a' , ' b' ]);
314
+ const [ a , b ] = await myLoader .loadMany ([ ' a' , ' b' ])
314
315
```
315
316
316
317
This is equivalent to the more verbose:
317
318
318
319
``` js
319
- var [ a, b ] = await Promise .all ([
320
+ const [ a , b ] = await Promise .all ([
320
321
myLoader .load (' a' ),
321
322
myLoader .load (' b' )
322
- ]);
323
+ ])
323
324
```
324
325
325
326
- * keys* : An array of key values to load.
@@ -378,7 +379,7 @@ When using DataLoader, we could define the `User` type using the
378
379
and possibly fewer if there are cache hits.
379
380
380
381
``` js
381
- var UserType = new GraphQLObjectType ({
382
+ const UserType = new GraphQLObjectType ({
382
383
name: ' User' ,
383
384
fields : () => ({
384
385
name: { type: GraphQLString },
@@ -391,9 +392,12 @@ var UserType = new GraphQLObjectType({
391
392
first: { type: GraphQLInt }
392
393
},
393
394
type: new GraphQLList (UserType),
394
- resolve : (user , { first }) => queryLoader .load ([
395
- ' SELECT toID FROM friends WHERE fromID=? LIMIT ?' , user .id , first
396
- ]).then (rows => rows .map (row => userLoader .load (row .toID )))
395
+ resolve: async (user , { first }) => {
396
+ const rows = await queryLoader .load ([
397
+ ' SELECT toID FROM friends WHERE fromID=? LIMIT ?' , user .id , first
398
+ ])
399
+ return rows .map (row => userLoader .load (row .toID ))
400
+ }
397
401
}
398
402
})
399
403
})
@@ -415,15 +419,15 @@ function createLoaders(authToken) {
415
419
users: new DataLoader (ids => genUsers (authToken, ids)),
416
420
cdnUrls: new DataLoader (rawUrls => genCdnUrls (authToken, rawUrls)),
417
421
stories: new DataLoader (keys => genStories (authToken, keys)),
418
- };
422
+ }
419
423
}
420
424
421
425
// When handling an incoming web request:
422
- var loaders = createLoaders (request .query .authToken );
426
+ const loaders = createLoaders (request .query .authToken )
423
427
424
428
// Then, within application logic:
425
- var user = await loaders .users .load (4 );
426
- var pic = await loaders .cdnUrls .load (user .rawPicUrl );
429
+ const user = await loaders .users .load (4 )
430
+ const pic = await loaders .cdnUrls .load (user .rawPicUrl )
427
431
```
428
432
429
433
Creating an object where each key is a ` DataLoader ` is one common pattern which
@@ -438,19 +442,21 @@ value. If the same user is loaded by both keys, then it may be useful to fill
438
442
both caches when a user is loaded from either source:
439
443
440
444
``` js
441
- let userByIDLoader = new DataLoader (ids => genUsersByID (ids).then (users => {
445
+ const userByIDLoader = new DataLoader (async ids => {
446
+ const users = await genUsersByID (ids)
442
447
for (let user of users) {
443
- usernameLoader .prime (user .username , user);
448
+ usernameLoader .prime (user .username , user)
444
449
}
445
- return users;
446
- }));
450
+ return users
451
+ })
447
452
448
- let usernameLoader = new DataLoader (names => genUsernames (names).then (users => {
453
+ const usernameLoader = new DataLoader (async names => {
454
+ const users = await genUsernames (names)
449
455
for (let user of users) {
450
- userByIDLoader .prime (user .id , user);
456
+ userByIDLoader .prime (user .id , user)
451
457
}
452
- return users;
453
- }));
458
+ return users
459
+ })
454
460
```
455
461
456
462
0 commit comments