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