Javascript 在图像加载时区分不同的错误类型

Javascript 在图像加载时区分不同的错误类型,javascript,error-handling,http-status-codes,Javascript,Error Handling,Http Status Codes,我正在根据这个问题给出的公认答案来实现JavaScript服务器ping工具:。这基本上是通过假设ping服务器在n毫秒后没有响应时关闭来实现的 这很好,这是一种非常酷的方式,但是有两个相当大的陷阱: 并非所有服务器都能在分配的时间内响应 有时,在超时计时器完成之前,会抛出一个ERR\u CONNECTION\u TIMED\u OUT错误 这两种情况都会导致错误的结果。前者表示服务器可能处于联机状态且响应缓慢时处于脱机状态,后者表示服务器(可能)处于脱机状态时处于联机状态 在理想情况下,此代码

我正在根据这个问题给出的公认答案来实现JavaScript服务器ping工具:。这基本上是通过假设ping服务器在n毫秒后没有响应时关闭来实现的

这很好,这是一种非常酷的方式,但是有两个相当大的陷阱:

  • 并非所有服务器都能在分配的时间内响应
  • 有时,在超时计时器完成之前,会抛出一个
    ERR\u CONNECTION\u TIMED\u OUT
    错误
  • 这两种情况都会导致错误的结果。前者表示服务器可能处于联机状态且响应缓慢时处于脱机状态,后者表示服务器(可能)处于脱机状态时处于联机状态

    在理想情况下,此代码将捕获抛出的错误类型,并适当地处理。毕竟,如果抛出的错误是404 Not Found错误,那么这就意味着服务器已联机并已响应

    如果我们记录图像错误事件,我们看到的唯一错误是:

    事件{
    ...
    类型:“错误”
    }
    
    没有任何消息或任何东西暗示抛出的错误是什么,404和
    ERR\u CONNECTION\u TIMED\u
    错误都给出了相同的信息

    在Chrome的JavaScript控制台中看到的
    ERR\u CONNECTION\u TIMED\u OUT
    错误,我可以做些什么来捕获,而不是依赖于固定速度的计时器


    更新 复制此问题的最佳方法是(如我在上面链接的问题中所链接的)使用30000ms计时器,而不是1500ms计时器:

    this.timer = setTimeout(function () {
        if (_that.inUse) {
            _that.inUse = false;
            _that.callback('timeout');
        }
    }, 30000);
    
    'unknown'
    服务器显然不应该响应,但我们看到的是:

    在Chrome的控制台中,引发了以下错误:

    未能加载资源:
    net::ERR\u NAME\u未解析

    由于图像的
    onerror
    函数已触发,并出现上述一般错误,因此该函数认为这意味着1<代码>“未知”存在,并且2。它是在线的。
    ERR\u NAME\u NOT\u RESOLVED
    错误似乎只有Chrome知道,根本没有传递到错误事件


    更新2
    今天,我尝试用web套接字而不是图像来实现这一点,不幸的是,这些套接字也有同样的问题。关于返回的错误的唯一数据是
    类型:“error”
    -没有关于错误实际是什么的信息。

    我猜否决票和缺少评论或接近票意味着它只是随机的,没有任何特定的原因,所以感谢你提出了……有趣的问题(我不知道答案)但是,难道不是在问服务器是否在线,只是响应太慢,有点像以前看到一棵树倒在树林里,周围没有人听到的那样吗?如果它在线,如果它没有在你确定的适当时间内响应,那又有什么关系呢?@GeorgeMauer第一种情况没有那么重要,你是对的,如果服务器在给定时间内没有响应,我很乐意假设它已经停机。第二点是主要问题所在;如果我的浏览器认为连接已在计时器超时之前超时,则我的代码仅假设服务器必须联机,因为已生成一个通用的“错误”对象。不幸的是,这似乎是随机发生的。我已经让它发生在仅仅3秒钟之后,但我也没有让它发生在超过一分钟之后。将计时器设置为仅3秒似乎不够长。奇怪的是,当我使用上述方法时,我在chrome网络选项卡中只得到200个状态代码(尽管显然是一个错误)。你能可靠地重现条件2吗?