带有异步/等待的递归setTimeout
我正在递归地运行 setTimeout,所以我只想每分钟调用一次 API。
这是我的代码:
;(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)
}
})(1)
问题是:
- 当我启动我的服务器时,它会立即调用 API
- 拨打第二个电话需要一分钟(预期行为)
- 第二次调用后,开始顺序调用API,没有超时
回答
它立即调用它,因为这就是您的代码所做的。它ticker(1)立即执行函数调用。
当您从 调用ticker 时setTimeout(ticker, ...),您没有将minutes参数传递给该函数——这就是为什么setTimeout()没有正确延迟的原因。
如果您不想立即执行它,那么摆脱IIFE并以setTimeout(). 然后,当您ticker()从setTimeout()回调中调用时,请确保将minutes参数传递给它,通过将第三个参数传递给它setTimeout()或为其创建一个小回调函数。
这是一种实现:
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);
- also, i've been working with javascript for more than ten years, and i didn't know about that setTimeout signature, where you can pass the arguments like that!