javascript - 带有 async/await 的递归 setTimeout

标签 javascript node.js async-await 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)立即调用函数。
    当您从 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);
    

    关于javascript - 带有 async/await 的递归 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65875198/

    相关文章:

    c# - 除了 "await"之外还有哪些情况会允许同步代码被中断

    javascript - 当条件变量值通过node js中的循环传递时,Mongodb查找查询不起作用

    node.js - 使用 websockets 手动连接到 socket.io 1.x,容量测试

    javascript - 如何使用 mongoose 中的用户对象 id 数组返回文档数组?

    javascript - 不使用angularjs向下滚动时如何验证表单?

    node.js - 表达主体解析器 request.body 返回未定义

    node.js - 意外行为 - IIFE 需要时异步等待?

    javascript - 尝试读取文本文件 (.txt) 并在 onclick 按钮模式对话框中显示文本文件上的文本

    php - 显示 1x1 GIF(跟踪像素、网络信标)的最有效方式

    javascript - react 大括号问题