【问题标题】:How can I create a XMLHttpRequest wrapper/proxy?如何创建 XMLHttpRequest 包装器/代理?
【发布时间】:2011-01-26 19:56:30
【问题描述】:

想到的这些方法,各有什么优缺点?

方法一:增强原生实例

var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function() {
    var xhr = new _XMLHttpRequest();

    // augment/wrap/modify here
    var _open = xhr.open;
    xhr.open = function() {
        // custom stuff
        return _open.apply(this, arguments);
    }

    return xhr;
}

方法2:子“类”原生XMLHttpRequest

var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function() {
    // definePropertys here etc
}

XMLHttpRequest.prototype = new _XMLHttpRequest());
// OR
XMLHttpRequest.prototype = Object.create(_XMLHttpRequest);

// custom wrapped methods on prototype here
XMLHttpRequest.prototype.open = function() {
    // custom stuff
    return _XMLHttpRequest.prototype.open.apply(this, arguments);
}

方法 3:完全代理原生 XMLHttpRequest

var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function() {
    this.xhr = new _XMLHttpRequest();
}

// proxy ALL methods/properties
XMLHttpRequest.prototype.open = function() {
    // custom stuff
    return this.xhr.open.apply(this.xhr, arguments);
}

【问题讨论】:

  • 最简单的方法就是使用 jQuery(或任何其他 JavaScript 框架)。
  • 您的第一种方法对我来说似乎是错误的。我担心你会陷入递归循环,直到你得到一个堆栈溢出。 ;) 你为什么要这个呢?有很多更简洁的解决方案,不必提供对引用对象的函数调用。
  • Marcel:你说得对,它是一种类型,我已经修好了。
  • ThiefMaster:我的大部分问题都没有得到充分的回答......
  • 使用方法3我得到一个错误TypeError: Object [object Object] has no method 'setRequestHeader'

标签: javascript xmlhttprequest


【解决方案1】:

根据 JS 引擎,方法 1 会产生相当大的开销,因为每当实例化 XHR 时都会重新定义 xhr.open

方法 2 让我想“为什么首先需要 new _XMLHttpRequest”?有轻微副作用的感觉,但似乎效果很好。

方法 3:简单、老派,但不会立即奏效。 (考虑读取属性)

一般来说,我个人不太愿意覆盖浏览器对象,所以这对所有三种方法都是一个很大的缺点。最好使用其他变量,例如 ProxyXHR(只是我的 2 美分)

【讨论】:

    【解决方案2】:

    这可能取决于用例。就我而言,我想创建一个完整的代理,这似乎只能通过第三种方法实现。问题是 onreadystatechange 需要在原始 XHR 实现上设置。我猜有定义的 getter 和 setter 不能从外部更改。

    因为这个方法1和2都行不通。为了实现这一点,我写了一个完整的,这意味着我没有发现任何错误,这里是 XHR 的代理:A: How can I catch and process the data from the XHR responses using casperjs?。需要通过方法3来完成。

    【讨论】:

      【解决方案3】:

      我已经尝试了所有 3。我必须拦截来自我无法管理的代码中的调用,这些代码已经运行了 Boomerang AutoXHR 插件并拦截了调用。 #2 和 #3 只是导致错误,但 #1 在我奇怪的混乱用例中完美运行。

      【讨论】:

        【解决方案4】:

        使用下面的配置

        _XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

        参数详情: proxySetting - 代理配置 例如:SXH_PROXY_SET_DEFAULT、SXH_PROXY_SET_DIRECT、SXH_PROXY_SET_PROXY、SXH_PROXY_SET_PRECONFIG

        varProxyServer - 代理服务器的名称

        varBypassList - 您希望允许绕过代理服务器的主机名或 IP 地址。

        【讨论】:

          猜你喜欢
          • 2012-02-19
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多