Javascript:如何在处理程序中保留对请求启动器的引用?

时间:2010-07-07 19:45:05

标签: 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引用的内容),但鉴于OO-ified Javascript和AJAX几乎无处不在,必须是一个已知的,简单的问题,但我的谷歌在这里失败了。在C#中,事件是在附加到它们的人的上下文中调用的,而不是触发事件的对象,因此这不会每天出现。也许有一个更好的JS模式可以完全避免这个问题?

2 个答案:

答案 0 :(得分:4)

我不清楚你想要引用哪个变量。以下是在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,所以我调整了我的代码来做到这一点。

答案 1 :(得分:1)

你试过......

this.Request.onload = this.ActionResultHandler.apply(this);

我在想这就是你要找的东西(对不起,如果不是这样的话)。使用.apply(this)会将ActionResultHandler指向Object

查看this article关于绑定的信息!它帮助了我很多。