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

时间:2015-02-27 23:06:50

标签: javascript error-handling http-status-codes

我正在使用基于此问题的接受答案实现JavaScript服务器ping工具:Is it possible to ping a server from Javascript?。如果在 n 毫秒之后没有给出响应,则假设 pingged 服务器已关闭,这基本上可以正常工作。

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

  1. 并非所有服务器都在分配的时间内做出响应。
  2. 有时在我们的超时计时器结束之前会发出ERR_CONNECTION_TIMED_OUT错误
  3. 这两件事都会导致错误的结果。前者表明服务器可能在线并且响应缓慢时处于脱机状态,后者表明服务器在(可能)离线时处于联机状态。

    在理想的世界中,此代码将捕获抛出的抛出的错误类型并适当地处理它。毕竟,如果抛出的错误是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'服务器显然不会响应,但我们会看到:

      

    Example

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

      

    无法加载资源:net::ERR_NAME_NOT_RESOLVED

    由于图像的onerror函数已使用上面给出的一般错误触发,该函数认为这意味着1. 'unknown'存在,并且2.它在线。 ERR_NAME_NOT_RESOLVED错误似乎只是Chrome知道的内容,并且根本没有传递给错误事件。


    更新2

    今天我尝试用网络套接字而不是图像来做这件事,不幸的是,这些都遭遇了同样的问题。返回错误的唯一数据是type: "error" - 没有关于错误实际是什么的信息。

0 个答案:

没有答案