JSFiddle - React, Tailwind, and code Playground
by levchenko_d
TypeScript
const mapAsync = (array: Array<any>, iterateeFn: Function) => {
let index = 0;
let result: Array<any> = [];
return new Promise((resolve, reject) => {
if(!Array.isArray(array)){
return reject('Expected first argument to be an array');
}
if(typeof iterateeFn !== 'function'){
return reject('Expected second argument to be a function');
}
/**
* handle iteratee logic
*/
const handleItem = () => {
const item = array[index];
iterateeFn(item, index, (error: any, updatedItem: any) => {
if(error){
reject(error);
} else {
const isTheLastItem = index === array.length - 1;
result.push(updatedItem || item);
if(isTheLastItem) {
/** Exit cycle*/
resolve(result);
} else {
/** Run next cycle */
index++;
handleItem();
}
}
});
};
/** Prevent call for an empty array*/
if(!array.length){
return resolve(result);
}
/** Run first cycle*/
handleItem();
});
};
const filterAsync = (array: Array<any>, iterateeFn: Function) => {
return new Promise((resolve:any, reject: any) => {
const results = [];
mapAsync(array, (item:any, index:any, next:any) => {
iterateeFn(item, index, (isMatch:any) => {
if(isMatch){
results.push(item);
}
next();
});
})
.then(() => {
resolve(results);
});
});
};
filterAsync([1,2,3,4,56], (item:any, index:any, next:any)=>{
next(item > 3)
})
.then((results:any)=>{
console.log({results});
})