带有异步/等待的递归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!

以上是带有异步/等待的递归setTimeout的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>