Recursive Promises

by Rajesh Dixit

JavaScript 1.7

const createPromise = (args) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      const random = Math.floor(Math.random() * 100);
      console.log(`[${new Date().toISOString()}]args: ${args} with random: ${random}`);
      resolve(`${args} ${random}`);
    }, 1000);
  });
}
function test() {
  const actual = times(() => createPromise('data'), 3)
  .then((output) => {
  	console.log('Output', output)
  });
}

const times = (fn, n = 1) => {
	const result = [];
  const promise = fn();
  if (!promise) return;
  
  let finalResolver;
	const finalPromise = new Promise((r) => {
  	finalResolver = r;
  })
  promise.then((value) => {
  	result.push(value)
  	const innerPromise = times(n === 1 ? finalResolver.bind(null, result) : fn, n - 1)
    if (innerPromise) {
    	innerPromise.then((v2) => {
      	result.push(...v2)
        finalResolver(result);
      })
    }
  })
  return finalPromise
}

// With Async/ Await.
/* const times = async (fn, n = 1) => {
  let result = []
  for (let i = n; i > 0; i--) {
    result.push(await fn())
  }
  return result;
};
 */
test();