带有异步/等待的递归 setTimeout

And*_*dez 22 javascript settimeout node.js async-await

我正在递归地运行 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)
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 当我启动我的服务器时,它会立即调用 API
  • 拨打第二个电话需要一分钟(预期行为)
  • 第二次调用后,开始顺序调用API,没有超时

jfr*_*d00 17

它立即调用它,因为这就是您的代码所做的。它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);
Run Code Online (Sandbox Code Playgroud)

  • 另外,我使用 javascript 已有十多年了,我不知道 setTimeout 签名,您可以在其中传递这样的参数! (4认同)