Recursive setTimeout with async/await
Maybe you just need to use some schedule manager, like bree
?
As of your code
- you don't need IIFE here. Just call
setTimeout(() => ticker(1), minutes * 60 * 1000)
- change the inner
setTimeout
call likewise to pass theminutes
parameter, because right now you just passundefined
. That meansimmediately
forsetTimeout
.
It calls it immediately because that's what your code does. It executes the ticker(1)
function call immediately.
When you call ticker from the setTimeout(ticker, ...)
, you aren't passing the minutes
parameter to that function - that's why the setTimeout()
doesn't delay properly.
If you don't want it executed immediately, then get rid of the IIFE and just start it with a setTimeout()
. And, then when you call ticker()
from the setTimeout()
callback, be sure to pass the minutes
arguments to it, either by passing the third argument to setTimeout()
or by making a little callback function for it.
Here's one implementation:
async function ticker(minutes) {
try {
const res = await coingecko.global()
const { market_cap_percentage } = res.data.data
dominance = { btc: market_cap_percentage.btc, eth: market_cap_percentage.eth }
console.log({ dominance })
} catch (ex) {
console.log(ex.message)
} finally {
setTimeout(ticker, minutes * 60 * 1000, minutes);
}
}
setTimeout(ticker, minutes * 60 * 1000, 1);