♻️ Make function memoization via data cache, to skip some async process (for the same data) and call the callback function directly.
$ npm install --save function-memoization
const { cacheFunction, cacheMethod } = require('function-memoization');
let func = function (p1 = 0, p2 = {}, p3 = [], callback) { /**/ };
let func1 = cacheFunction(func);
func1(/* args */);
let obj = {
method: func
};
cacheMethod(obj, 'method');
obj.method(/* args */);
Note: make sure the cached data amount is in control.
Boolean value, whether to execute the callback function asynchronously, false
by default.
func = cacheFunction(func, { async: true });
func(/* args */);
cacheMethod(obj, 'method', { async: true });
obj.method(/* args */);
The following is an example:
const { cacheFunction, cacheMethod } = require('../src/index.js');
// Define function1
let testFunction = (p1, p2, p3, callback) => {
console.log('function1 begins');
let arr = ['function1', p1, p2.n, p3[0]];
setTimeout(function () {
callback(arr);
}, 1000);
};
// Define function2 as a method of an object
const obj = {
testMethod: function (p1, p2, p3, callback) {
console.log('function2 begins');
let arr = ['function2', p1, p2.n, p3[0]];
setTimeout(function () {
callback(arr);
}, 1000);
}
};
// Cache function1, keeping the callback "async"
testFunction = cacheFunction(testFunction, {
async: true
});
// Cache function2
cacheMethod(obj, 'testMethod');
// Execute function1 1st time
testFunction(1, { n: 2 }, [3], function (res) {
console.log(res);
});
// Execute function2 1st time
obj.testMethod(4, { n: 5 }, [6], function (res) {
console.log(res);
});
setTimeout(function () {
// Execute function1 2nd time
testFunction(1, { n: 2 }, [3], function (res) {
console.log(res);
});
// Execute function2 2nd time
obj.testMethod(4, { n: 5 }, [6], function (res) {
console.log(res);
});
}, 1000);
It will output:
function1 begins
function2 begins
[ 'function1', 1, 2, 3 ]
[ 'function2', 4, 5, 6 ]
[ 'function2', 4, 5, 6 ]
[ 'function1', 1, 2, 3 ]
MIT