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});
})