【问题标题】:A better approach to request data from server every x minute每 x 分钟从服务器请求数据的更好方法
【发布时间】:2021-11-17 08:45:37
【问题描述】:

我知道我可以使用 setInterval 每 1 分钟向服务器发送一个请求,以查看是否有新内容添加到数据库中,以便我可以获取它并根据此更新 UI

但是对于我从不同文章中读到的内容,我感到困惑,有人说这是不好的做法,而其他人则使用它

所以我在这里询问是否有更好的方法来完成此任务,或者 setInterval 可以毫无问题地处理任务

【问题讨论】:

  • setInterval 如果您需要进行轮询(并且确定请求本身花费的时间远短于 1m),那绝对没问题。但是有多种技术可以让您从服务器推送更新 - 研究它们!
  • 你能链接那篇说这是一种不好的做法的文章吗?
  • 使用长轮询、websocket 或 SSE。
  • @Bergi,长轮询需要对每个请求进行额外的身份验证步骤,因此会消耗资源,而对于相同的用例,websocket 会更好。

标签: javascript node.js reactjs mongodb express


【解决方案1】:

您可以配置一个简单的 cronjob。
无论您是通过 VPS 还是共享主机使用它(其中大多数都安装了 cron),您是否可以使用 cron-job.org 之类的免费在线服务。

setInterval 和 setTimeout 没问题,但不要忘记 JS 是单线程的,并且选择与我们的需求相对应的线程,因为它们之间的区别很重要。

这个有趣的点不是我说的:

setInterval 与其说是性能技巧,不如说是 并发最佳实践。 setInterval 有可能执行 过早地编码到你期望的时候。

例如,

function doSomething () {
   // I take 500 ms to run
}

doSomething();
setInterval(doSomething, 150);

这段代码将立即运行,然后下一次迭代 doSomething 在它完成执行当前迭代之后。间隔 计时器永不停止!这有可能冻结您的运行时 环境通过不断运行其代码,并且不允许 系统来做其他事情。

function doSomething () {
   // I take 500 ms to run
  setTimeout(doSomething, 150);
}

doSomething();

尽管这看起来基本相同,但不同之处在于 doSomething 总是会在运行后等待 150 毫秒,然后再重新排队 下一次迭代执行。这允许系统运行其他 操作并防止您的运行时被锁定。 https://www.reddit.com/r/javascript/comments/51srsf/is_it_still_true_that_we_shouldnt_use_setinterval/

【讨论】:

  • 浏览器显示的网站可以使用cron吗?
  • @Bergi 我不确定我是否理解您的问题...您当然知道,配置 cronjob 以在给定的时间间隔内进行 api 调用或任何请求并不是什么大问题。从 1 分钟开始,免费服务甚至允许您设置所有内容。如果应用程序需要秒调用,那么应该去 nodejs...
  • 这个问题是关于浏览器中的 JavaScript,而不是桌面应用程序或服务器端程序。您不能从浏览器安排 cronjobs。
  • 我坚持认为,使用 cron-job.org(和其他)这样的服务,您可以安排任何您想要的 cronjob。限制很少(不得针对包含重定向的页面)。所以它在大多数情况下都能完成工作。这就是为什么我很少在 SO 上发帖的原因。你们甚至在仔细阅读之前就扣动了扳机......可悲的是,我没有什么可以证明的,就像许多开发人员一样,我只是想帮助 OP。
【解决方案2】:

好吧,如果您必须知道是否发生了变化,我会考虑使用套接字是一个更好的选择。当然,如果您的服务器已准备好实现这种机制。

如果您没有机会更改服务器上的逻辑(第三方 API 或其他东西),请实践最常见的解决方案。

但是对于这种解决方案,您有一些注意事项:

  • 您应该自己处理何时清除超时;如果你不这样做,那么你至少会有内存泄漏;
  • 有些东西永远不会改变,大量数据 - 您需要使用缓存策略实现这种优化;
  • 不确定安全性 - 如果您的很多用户使用此服务,服务器可能会因为 DDOS 阻止您的应用;

setTimeout 本身是可以的。是否有更好或更合适的解决方案取决于您的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2020-02-28
    • 2016-07-10
    • 2018-04-10
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多