lazylol v1.0.0
lazylol
Small utility to lazyload a resource only once and handle multiple calls with a queue.
How to use
Installing
yarn add lazylol
How it works
You call lazylol passing a loader function which is responsible for loading
a given resource you'll need in the future. When you call it, the loader function won't
be executed right away. Instead, it'll wait for you to request loading. In order to request
loading, call the function returned from lazylol. Let's call this returned function requester.
const requester = lazylol(loader)Once you set up lazylol using the code above, you can call the requester function multiple times
throughout your application.
In the first time you call the requester, it'll call the stored resource loading function you passed
initially (loader) and wait for it to resolve, expecting it to return a promise. The requester
function will resolve or reject based on the outcome of your loader promise.
If there are multiple calls to the requester function while the loader is still running,
it'll enqueue them and wait for loader to complete, calling them in the order they entered the queue
once the resource is ready. If the loader call rejects for some reason, all the pending requester
calls will also reject.
Once loader resolves for the first time, all future calls will access the cached returned value.
If loader rejects and you call requester afterwards, it'll restart the process and retry loading
the resource by calling loader again.
Example
Here's an example of an Express server that will only start a connection to the database once the first request arrives, and use the same connection on all next requests.
'use strict'
const lazylol = require('lazylol')
const express = require('express')
const app = express()
// imagine we have a "db" module with a promised function that connects
// to the database and resolves with the connection instance
const { createConnection } = require('./db')
const getConnection = lazylol(createConnection)
app.get('/', (req, res) => {
getConnection()
.then(async connection => {
const result = await connection.query('select * from something')
console.log(result)
res.json(result)
})
.catch(err => res.status(500).json(err))
})
app.listen(3000)