Create a loader function that transparently batches loads either by event loop tick or by a configurable window.
This tool is designed to help reduce costly round-trips for two scenarios:
- Requests to an asynchronous service have important overhead that can be reduced by batching multiple requests.
- Clusters of requests for the same data may be issued throughout a codebase and could be optimized by sharing the same request to the underlying service.
Caching is not provided by this tool because it could easily be enabled by putting the batched loader function behind a transparent, read-through cache library like async-cache or catbox.
const Batcher = ;const MongoClient = MongoClient;const options =timeoutMs: 2000 // Automatically fail loads that take more than 2s;const loaderUser = Batcher;;// ... later in the same event loop tick (or within the window defined by// the windowMs option);;
Creates a batched loader function where:
loadKeys(keys, notifier)- the function that will issue a batch where:
keys- an array of keys that should be loaded.
Notifierinstance to be used to signal results, errors and the completion of the batch.
options- an object containing:
context- an optional context object that will be set as the
loadKeysfunction's receiver (
generateKey(request)- a function that should convert the
requestitem into a key that the
issueBatchfunction can handle.
timeoutMs- the number of milliseconds after which a batch will time out (defaults to
windowMs- the number of milliseconds that determine the window for inclusion in the current batch (defaults to
0which means in the same tick).
Returns a function with the signature
loader(request, callback) where:
request- is either a
Booleanor is an object that is accepted by the
callback(error, result)- is a callback function that will be invoked with either an error or the result of the batched load.
Interface for the
notifier object of the
loadKeys function where:
notifier.result(key, value)- signal that
valuewas loaded for
notifier.error(key, error)- signal that the error
errorwas loaded for
notifier.complete([error])- signal that the batch has completed and that any unfulfilled requests should be fulfilled with the optional error argument. If no
erroris specified, a default error will be used.