Skip to content

Small lib to batch and cache loading of async data, bring your own fetch implementation

License

Notifications You must be signed in to change notification settings

ulrikstrid/bs-dataloader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bs-dataloader

CircleCI

This is a rewrite of dataloader js lib in reasonml for use with BuckleScript. I have a goal to make it work with native OCaml in the future but I still rely on some JavaScript structures.

Usage

module UserLoaderImpl = {
  type value = user;
  type key = userId;

  /* The batchLoadFun needs to wrap the returned values in Js.Result.t so that we can reject each promise instead of all */
  let batchLoadFun = userIds => batchGetUsers(userIds);
  let options: options = {batch: true, maxBatchSize: 256, cache: true};
};

module UserLoader = DataLoader.Make(UserLoaderImpl);

UserLoader.load("1")
|> Js.Promise.then_(
  user => {
    displayUser user;
    Js.Promise.resolve ();
  }
);

/* elsewhere in your app */

UserLoader.load("2")
|> Js.Promise.then_(
  user => {
    interactWithUser user;
    Js.Promsie.resolve();
  }
);

The example above will load both users at the same time with 1 request. If we later need one of the loaded users again we will get a cached version of the promise, if you need a new version from the server you can clear the key.

updateUser(~userId, ~userPatch)
|> Js.Promise.then_(_ => Js.Promise.resolve(UserLoader.clear userId))
|> Js.Promise.then_(_ => UserLoader.load("1"))
|> Js.Promise.then_(user => {
  displayUser user;
  Js.Promise.resolve ();
});

Development

Build

npm run build

Build + Watch

npm run watch

Test

npm run test

Editor

If you use vscode, Press Windows + Shift + B it will build automatically

About

Small lib to batch and cache loading of async data, bring your own fetch implementation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages