【问题标题】:NodeJS SetInterval with Async/AwaitNodeJS SetInterval 与 Async/Await
【发布时间】:2021-06-15 08:28:13
【问题描述】:

我正在使用以下代码和 websocket 从数据库中抓取数据并返回给用户。它返回聊天消息、用户状态和其他内容。代码按预期工作(在测试中),但我有几个问题。

                setInterval(async () => {
                    if (connectedUserIDs.length > 0) {
                        logger.info("short loop...")
                        await eventsHelper.extractEvents(db, connectedUserIDs, connectedSockets, ws)
                    }
                }, 5000)

问题 1. SetInterval 会等待“await”还是每 5 秒触发一次?无论如何,我认为它会每 5 秒触发一次。

如果是这样的话。

问题 2. 有没有办法重复上述任务,但确保仅在前一次运行以至少 5 秒的时间完成时才重新运行?我想避免同时运行多个查询的情况。也许每次都可以取消并重新启动 setInterval...

谢谢 亚当

【问题讨论】:

  • @Fred Stark LGTM 的答案,但我只想评论说,鉴于您有 websocket,这种轮询循环应该是不必要的。如果可能的话,最好让服务器在更改发生时推送更改(当然,您可能无法控制服务器的操作)。
  • @seesharper 这是一个很好的观点。理想情况下,您将拥有一个数据存储,您的组件可以从/收听数据,然后在 websocket 事件上运行框架的 setState 等效
  • eventsHelper.extractEvents() 是否真的返回一个仅在其操作完成时才解析的承诺。否则,您接受的答案也不会实现您的目标。
  • eventsHelper.extractEvents() 为过去 15 秒内发生变化的数据抓取多个 DB 表并发送到相关连接。诸如“添加为收藏”、“聊天消息”、“发送给您的礼物”等...(约会系统)...这仅用于发送数据。所有更新/插入都通过对 api 的 POST/GET 调用和 DB 进行...我听说您可以以不同的方式使用 websockets 来获得相同的结果,我现在将对此进行一些研究...谢谢非常感谢您的帮助 Stack Overflow!!!

标签: node.js async-await setinterval


【解决方案1】:

问题 1. SetInterval 会等待“await”还是每 5 秒触发一次?无论如何,我认为它会每 5 秒触发一次。

是的,它会天真地每 5 秒重新运行一次

问题 2. 有没有办法重复上述任务,但确保只有在前一次运行以至少 5 秒的时间完成时才重新运行

防止冲突的最简单方法是在等待之后设置下一次运行:

let timeoutId;
const extractEvents = async () => {
  if (connectedUserIDs.length > 0) {
    logger.info("short loop...");
    await eventsHelper.extractEvents(db, connectedUserIDs, connectedSockets, ws);
  }
  timeoutId = setTimeout(extractEvents, 5000);
};
timeoutId = setTimeout(extractEvents, 5000);

存储 timeoutId 以便您以后清除它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2018-10-13
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多