Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wjsc/hold-on
Returns a function execution result or a cached result
https://github.com/wjsc/hold-on
memoization
Last synced: about 2 months ago
JSON representation
Returns a function execution result or a cached result
- Host: GitHub
- URL: https://github.com/wjsc/hold-on
- Owner: wjsc
- License: mit
- Created: 2019-07-18T19:56:53.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-12-30T18:17:21.000Z (about 2 years ago)
- Last Synced: 2024-11-06T16:57:05.335Z (about 2 months ago)
- Topics: memoization
- Language: JavaScript
- Size: 181 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![Current Version](https://img.shields.io/npm/v/@wjsc/hold-on.svg)
![NPM Minified size](https://img.shields.io/bundlephobia/min/@wjsc/hold-on.svg)
![Github Code Size](https://img.shields.io/github/languages/code-size/wjsc/hold-on.svg)
![Downloads/Year](https://img.shields.io/npm/dy/@wjsc/hold-on.svg)
![Issues](https://img.shields.io/github/issues/wjsc/hold-on.svg)
![License](https://img.shields.io/github/license/wjsc/hold-on.svg)
![Contributors](https://img.shields.io/github/contributors/wjsc/hold-on.svg)[![NPM](https://nodei.co/npm/@wjsc/hold-on.png)](https://nodei.co/npm/@wjsc/hold-on)
# Hold-on
## Use case
This package can be used in this scenario
1. You have a costly function: time consuming, heavy CPU or IO usage
2. You need to perform that function frequently
3. The result of your function can change over time
4. You can tolerate some -configurable- inconsistency
5. You want to optimize that process## How it works
It stores in memory the result of your function for immediate access, and clears that memory after a specified time.
It returns a function that can be used instead your original one.```
const hold = require('@wjsc/hold-on');
const myOptimizedFunction = hold(,## Usage
#### 1. First example
```
const hold = require('@wjsc/hold-on');// Define your costly function: Let's supose it's so heavy!
const myFunction = () => new Date();// Make a new version of your function with 500 ms cache
const myOptimizedFunction = hold(myFunction, 500);// This code will execute new Date() only once
for(let i = 0; i<50; i++){
// And it prints always the same date
console.log(myOptimizedFunction());
}
```#### 2. Second example: Retrieving a remote resource
```
const hold = require('@wjsc/hold-on');
// Any HTTP client
const fetch = require('node-fetch');const myFunction = () => fetch('https://httpstat.us/200')
.then(res => res.text());
const myOptimizedFunction = hold(myFunction, 5000);// This code will execute the HTTP GET only once
for(let i = 0; i<50; i++){
myOptimizedFunction()
.then(console.log);
}
// If you call the function after 5000 ms
// the request will be executed again```
#### 3. Third example: Cache file from local storage
```
const hold = require('@wjsc/hold-on');
const fs = require('fs');
const myFunction = () => new Promise((resolve, reject) => {
fs.readFile('./my-file', 'utf8', (err, data) =>
err ? reject(err) : resolve(data)
)
})
const myOptimizedFunction = hold(myFunction, 5000);
myOptimizedFunction().then(console.log);```
#### 4. Fourth example: It's also great to cache a file from a remote Storage such as S3
```
const hold = require('@wjsc/hold-on');
const aws = require('aws-sdk');
aws.config.update({
secretAccessKey: 'ABCDE',
accessKeyId: '12345'})
const s3 = new aws.S3();const myFunction = () => {
return new Promise((resolve, reject) => {
s3.getObject({
Bucket: 'my-bucket',
Key: 'my-file'
}, (err, data) => {
if ( err ) reject(err)
else resolve(data.Body.toString())
})
})
}
const myOptimizedFunction = hold(myFunction, 5000);
myOptimizedFunction().then(console.log);```
## 100% Tested Library
Every line of code is tested
https://github.com/wjsc/hold-on/blob/master/test/index.test.js## Tiny size
Less than 20 lines of code and no dependencies
## Advanced
#### How to force terminationThis function uses setTimeout to clear the internal cache. In some cases, you may need to clear this timer.
This can be usefull if you are running a script that doesn't end at desired time, or if you want to terminate a background timer.```
const myFunction = () => {};
const myOptimizedFunction = hold(myFunction, 100000000);
clearInterval(myOptimizedFunction.interval);
```#### How to clear the memory cache
Just use the original function, or create a new function version.
Package name reference: https://www.youtube.com/watch?v=WPnOEiehONQ