Javascript AJAX(XMLHTTPRequest)时间延迟

Javascript AJAX(XMLHTTPRequest)时间延迟,javascript,ajax,xmlhttprequest,Javascript,Ajax,Xmlhttprequest,我是AJAX新手,有这个问题 我正在创建一个photogallery页面,并在上面创建了一个Javascript类来管理整个过程。下面是类中的一个方法,该类调用先前已成功初始化的XMLHTTPRequest对象: this.AJAX_update = function(id) { //initialize AJAX - this is done successfully this.AJAX_initialize(); var url = "ScriptLibrary/ga

我是AJAX新手,有这个问题

我正在创建一个photogallery页面,并在上面创建了一个Javascript类来管理整个过程。下面是类中的一个方法,该类调用先前已成功初始化的XMLHTTPRequest对象:

this.AJAX_update = function(id) {
    //initialize AJAX - this is done successfully
    this.AJAX_initialize();
    var url = "ScriptLibrary/gallery_update.php?img=" + id;
    //this.ajax_request is an internal variable which is
    //initialized in this.AJAX_initialize() and is
    //XMLHTTPRequest type
    this.ajax_request.open("GET", url, true);
    this.ajax_request.onreadystatechange = processAJAX;
    this.ajax_request.send(null);
}
我不知道如何在onreadystatechange中调用类的内部方法,因此我在类外部创建了一个函数,该函数调用类内部的一个方法,前提是类的实例已在其所在的页面上创建。页面上的类实例是变量“gallery”。以下是函数:

function processAJAX() {
    gallery.AJAX_process();
}
this.AJAX_process = function() {
    if (this.ajax_request.readyState == 4) {
        if (this.ajax_request.status == 200) {
            //get the response
            var response = this.ajax_request.responseXML;

            //Here I set the internal variables according to the value
            //returned from the server
            //...........
            //...........
            //...........

            //change image on the page
            var self = this;
            setTimeout(function() {
                self.swap_dissolve();
            }, 50);

        }
    }
}
以下是AJAX_process()函数的代码:

function processAJAX() {
    gallery.AJAX_process();
}
this.AJAX_process = function() {
    if (this.ajax_request.readyState == 4) {
        if (this.ajax_request.status == 200) {
            //get the response
            var response = this.ajax_request.responseXML;

            //Here I set the internal variables according to the value
            //returned from the server
            //...........
            //...........
            //...........

            //change image on the page
            var self = this;
            setTimeout(function() {
                self.swap_dissolve();
            }, 50);

        }
    }
}
所以,我的问题是:

最初,我尝试直接调用内部函数,方法是这样做。swap_dissole(),但它不起作用。基本上,AJAX_process()方法根据服务器的响应更改某些类内部变量的值,这些值在swap_dissole()中用于实际更改页面上的图像。可能发生的情况是swap_dissole()无法正确更改图像,因为它看到变量AJAX_process()的值为null或未更新。当我添加时间延迟时,问题消失了。我不明白为什么会这样。我确实检查readyState==4,因此服务器的响应已经完全返回,因此函数设置的任何值都是最终值,可以立即使用,那么为什么我不能立即使用这些值,并且必须等待

如果我的代码中有任何解决此问题的建议或错误,我们将不胜感激

如果你对我有任何问题,请发表对这个问题的回复


谢谢。

您想使用“闭包”(例如,将函数对象传递给setTimeout)

想象一下(见鬼,在代码中替换它以查看):

警报应显示“废话”(或您分配给它的任何内容)。该值可用于匿名函数对象,因为已创建闭包绑定(函数可以访问封闭函数作用域的变量)

这是一个参考资料:更多的是一个软介绍:

快乐编码

编辑/p.S.您还可以编写AJAX处理程序,如下所示(这只是强制执行正确的“this”上下文的一个闭包——一些框架为此提供了方便的函数):


您甚至可以使用双重绑定,但是…再次祝您编码愉快:-)

谢谢您的建议。我不相信你能做到。然而,这仍然不能解决问题。我还得等。是什么导致swap_dissole()无法立即工作?我刚刚实现了您关于onreadystatechange=函数()的最后一个建议。。。这似乎解决了问题。非常感谢。之前发生的事情是swap\u dissole()没有看到变量值进程\u AJAX()更新。显然,按照您建议的方式调用进程_AJAX()可以解决这个问题。