我正在使用基于此问题的接受答案实现JavaScript服务器ping工具:Is it possible to ping a server from Javascript?。如果在 n 毫秒之后没有给出响应,则假设 pingged 服务器已关闭,这基本上可以正常工作。
这很棒,这是一种非常酷的方式,但有两个相当大的陷阱:
ERR_CONNECTION_TIMED_OUT
错误 这两件事都会导致错误的结果。前者表明服务器可能在线并且响应缓慢时处于脱机状态,后者表明服务器在(可能)离线时处于联机状态。
在理想的世界中,此代码将捕获抛出的抛出的错误类型并适当地处理它。毕竟,如果抛出的错误是404 Not Found错误,这反直觉意味着服务器在线并已响应。
如果我们记录图像错误事件,我们唯一看到的错误是:
Event {
...
type: "error"
}
没有任何消息或任何暗示错误抛出的内容,404和ERR_CONNECTION_TIMED_OUT
错误都提供相同的信息。
我该怎么做才能捕获我在Chrome的JavaScript控制台中看到的ERR_CONNECTION_TIMED_OUT
错误,而不是依赖于固定速度计时器?
我能够复制此问题的最佳方法是altering Trante's JSFiddle demo(与上面链接的问题相关联)使用30000ms计时器而不是1500ms计时器:
this.timer = setTimeout(function () {
if (_that.inUse) {
_that.inUse = false;
_that.callback('timeout');
}
}, 30000);
'unknown'
服务器显然不会响应,但我们会看到:
在Chrome的控制台中,引发了以下错误:
无法加载资源:
net::ERR_NAME_NOT_RESOLVED
由于图像的onerror
函数已使用上面给出的一般错误触发,该函数认为这意味着1. 'unknown'
存在,并且2.它在线。 ERR_NAME_NOT_RESOLVED
错误似乎只是Chrome知道的内容,并且根本没有传递给错误事件。
今天我尝试用网络套接字而不是图像来做这件事,不幸的是,这些都遭遇了同样的问题。返回错误的唯一数据是type: "error"
- 没有关于错误实际是什么的信息。