A simple typescript decorator for parallel async calls batching inspired by graphql/dataloader

Photo by Bernd 📷 Dittrich / Unsplash

Hi there 👋🏻

I've create a lib heavily inspired by graphql/dataloader, that makes it easier to implement parallel async calls batching using simply a decorator (or creating a custom Batcher class if you want), you just need to decorate your class method with @InBatches() and all the magic happens in the background for you, check it out.

https://github.com/onhate/inbatches

import { InBatches } from 'inbatches';

class MyService {

  // (optional) overloaded method, where you define the keys as `number` and the return type as `string` for typings
  async fetch(keys: number): Promise<string>;

  // in reality the Decorator will wrap this method and it will never be called with a single key :)
  @InBatches() // This method is now batch-enabled
  async fetch(keys: number | number[]): Promise<string | string[]> {
    if (Array.isArray(keys)) {
      return this.db.getMany(keys);
    }

    // the Decorator will wrap this method and because of that it will never be called with a single key
    throw new Error('It will never be called with a single key 😉');
  }
}

const service = new MyService();

const result = [1, 2, 3, 4, 5].map(async id => {
  return await service.fetch(id);
});

// The result will be an array of results in the same order as the keys
result.then(results => {
  console.log(results); // Output: [{ id: 1, name: 'Result for key 1' }, ...]
});