【问题标题】:Is it okay to use an infinite loop to constantly check the Connection to a Server? [closed]可以使用无限循环不断检查与服务器的连接吗? [关闭]
【发布时间】:2021-03-15 10:42:22
【问题描述】:

我今天正在编写我的第一个 Angular 应用程序。现在我想检查与服务器的连接。如果它离线,应该会出现一个屏幕,上面写着“你离线,但你需要一个连接”。我有一个非常好的 JavaScript 函数。但是现在,我只能在单击特定按钮时检查我的连接状态。但是我想经常检查连接,所以如果连接关闭,屏幕会立即出现。

我从 2 年开始就开始编程,过去我经常听到“不要使用无限循环”或“从不使用无限循环”等句子。

我的问题是,在这种情况下可以使用无限循环吗?还是有其他解决方法?

我的代码很简单:

var isOnline;
function testIfOnline() {
    if(navigator.onLine) {

        if (!isOnline) {
            hideConnectionView();
        }

        isOnline = true;
    } else {
        if (isOnline) {
            console.log("Die Verbindung zum Server wurde unterbrochen!");
        } else {
            console.log("Es konnte keine Verbindung zum Server aufgebaut werden!");
        }

        isOnline = false;

        //Restlicher Code:

        showConnectionView();

    }
}
  1. 问题: 是否有特定规则规定,何时允许使用无限循环或其他内容?

【问题讨论】:

  • “允许”谁?当人们说有这样的“规则”时,他们的意思不是“你会因为这样做而受到一些权威的惩罚”,他们的意思是“这样做是个坏主意”。与其寻找何时这是一个坏主意,不如试着理解为什么这是一个坏主意;那么您就可以对可能适用于您的特定情况的权衡做出自己的决定。
  • 在其他语言中一直使用无限循环,但在 Javascript 中轮询服务器并不是我要使用的(您将阻塞主线程/唯一线程)。使用setInterval,这就是它的用途。或者可能是 websockets,尽管这是一个更复杂的话题。
  • 这里的其他几个程序员说过。我在技术上被允许使用它们,但他们说,我应该尽量避免无限循环。
  • @JaredSmith 是的,我会用 Web Socket API 做到这一点

标签: javascript html node.js angular infinite-loop


【解决方案1】:

不好 :D 在这种情况下,不需要无休止地调用函数,而且因为有事件,所以过度杀伤。

考虑一下:

import {fromEvent, merge} from 'rxjs'

merge(
   fromEvent(window, 'online'),
   fromEvent(window, 'offline'),
).subscribe(
  () => {
    const condition = navigator.onLine ? "online" : "offline";
    console.log(condition);
  }
)

编辑:为了解决拔出机器时这不起作用的事实,我们可以像这样扩展它:

import { interval, merge, fromEvent } from 'rxjs'; 
import { mapTo } from 'rxjs/operators';


merge(
  fromEvent(window, 'online'),
  fromEvent(window, 'offline'),
  interval(1000),
).pipe(
  mapTo(navigator.onLine),
).subscribe(
  online => { 
    const condition = navigator.onLine ? "online" : "offline";
    console.log(condition);
  }
)

Demo

【讨论】:

  • 这是“正确”的做法。
  • 我是 Angular 的新手,我认为这段代码应该写在 app.component.tsapp.module.ts 中。正如我所说,我第一次使用 Angular :D
  • 如果网络正常但服务器宕机了怎么办?离线事件非常有用,但是当您尝试调用服务器时,应该捕获与服务器的失败连接。我认为这个简短的 sn-p 应该用没有 rxjs 的 vanilla javascript 编写
  • @yama_HD 模块中没有代码,应该在组件中,或者更好的是在服务中。
  • @Endless 这是一个不同的问题,但有一个重试和 catchError 运算符
【解决方案2】:

您可以使用 nodemon 连续运行您的服务器nodemon

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2011-06-23
    相关资源
    最近更新 更多