Javascript:如何在处理程序中保留对请求发起者的引用?

标签 javascript ajax design-patterns

我通常不是一个 Javascript 人,但我一直在潜心阅读 Douglas Crockford's book ,并编写一些琐碎、有用的花絮作为 Chrome 扩展和 Node.js (请注意,这个问题与他们中的任何一个都无关)。

现在,我正在尝试弄清楚如何保留对发起 AJAX 请求的对象的引用,即:一旦我设置了 onload 事件处理程序(这是来自 Chrome 扩展程序内部,所以我使用基本 XMLHttpRequest 对象),有什么方法可以让我在以下示例中引用 MyObject:

MyObject.prototype = {
    PerformAction: function() {
        this.Request = new XMLHttpRequest();
        this.Request.open("GET", this.ConstructUrl(), true);
        // From within ActionResultHandler, 'this' will always be the XMLHttpRequest
        this.Request.onload = this.ActionResultHandler,
        this.Request.send(null);
    }
}

准确地执行此操作会将 this 指定为请求对象本身,如果我简单地引入一个包装器:

this.Request.onload = function() { ActionResultHandler() };

好吧,这不会做任何事情,因为 ActionResultHandler 现在超出了范围。我在这里问的原因是因为我只发现了调用者操纵的微不足道的情况(例如,从函数内部操纵this引用的内容),但考虑到面向对象的Javascript和AJAX实际上是在任何地方,这都必须是一个已知的、简单的问题,但我的 Google-fu 在这里让我失望。在 C# 中,事件是在附加事件的上下文中调用的,而不是在触发事件的对象的上下文中调用,因此这种情况不会每天都会出现。也许有更好的 JS 模式可以完全避免这个问题?

最佳答案

我不太清楚你想要保存哪个变量的引用。下面介绍了如何在 onload 处理程序中保留对 MyObject 的引用:

MyObject.prototype = {
    PerformAction: function() {
        var MyObjectRef = MyObject,
            ActionResultHandler = this.ActionResultHandler;

        this.Request = new XMLHttpRequest();
        this.Request.open("GET", this.ConstructUrl(), true);
        // From within ActionResultHandler, 'this' will always be the XMLHttpRequest
        this.Request.onload = function () {
                ActionResultHandler.apply(MyObjectRef, arguments);
            };
        this.Request.send(null);
    }
}

已编辑

好吧,我再次重读了您的问题,您似乎想在 MyObject 的上下文中执行 ActionResultHandler,因此我调整了代码来执行此操作。

关于Javascript:如何在处理程序中保留对请求发起者的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3198264/

相关文章:

javascript - 我如何在不破坏导航栏上的长值的情况下调整浏览器的大小?

java - 结合工厂方法和单例设计模式

jquery - 如何使用 jquery Ajax 将两个数据模型从 View 传递到 Controller

javascript - jQuery AJAX 请求返回与预期不同的 JSON

jquery - Rails ajax 请求仅加载 View html

C++:当包含从类模板派生的类的 header 时,编译器警告 C4505

design-patterns - 如何克服反模式 "Big Ball of Mud"?

javascript - 跨浏览器确定Javascript垂直滚动百分比的方法

javascript - javascript代码什么时候执行?

javascript - 是否可以将 Canvas 图像复制到剪贴板?