The task is to write a function to reverse an array of numbers and print out each number every 2 seconds. Also print the reversed array in the end.
I wrote the following to achieve this, but it is a bad method, since I need to calculate the number of seconds in each setTimeout and also take extra steps to determine whether the for loop has reached the last iteration.
Is there a direct way to pause 2 seconds after each iteration and then print the reversed array in a synchronous way?
const reverseNumbers = (array) => { const n = array.length; return new Promise((resolve) => { let res = []; for (let i = n - 1; i >= 0; i--) { setTimeout(() => { console.log(array[i]); res.push(array[i]); if (i === 0) resolve(res); }, 2000 * (n - i)); } }); }; const array = [1, 2, 3, 4, 5]; let myPromise = reverseNumbers(array); myPromise.then((res) => console.log(res));
Advertisement
Answer
Is there a better way to return an updated value after setTimeout?
Promisify setTimeout
on its own, then use async
/await
:
function delay(t) { return new Promise(resolve => { setTimeout(resolve, t); }); } async function reverseNumbers(array) { const n = array.length; const res = []; for (let i = n-1; i >= 0; i--) { await delay(2000); console.log(array[i]); res.push(array[i]); } return res; } const array = [1, 2, 3, 4, 5]; const myPromise = reverseNumbers(array); myPromise.then(console.log);