AJAX(XMLHTTPRequest)时间延迟

时间:2010-10-24 20:56:33

标签: javascript ajax xmlhttprequest

我是AJAX的新手并且遇到了这个问题。

我正在创建一个照片库页面,并在其上创建了一个管理整个事物的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();
}

以下是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);

        }
    }
}

所以,这是我的问题:

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

我的代码中有任何建议或错误可以解决此问题。

如果您对我有任何疑问,请回复此问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

您想使用'闭包'(例如将函数对象传递给setTimeout)。

想象一下(哎呀,在你的代码中用它代替):

// when response = 200
var someValue = "blahblah" // whatever you read in
setTimeout(function () {
  alert(someValue)
}, 1000)

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

以下是参考:http://jibbering.com/faq/notes/closures/以及更多软介绍:http://blog.morrisjohns.com/javascript_closures_for_dummies.html

快乐的编码。

编辑/ P.S。您也可以编写AJAX处理程序(它只是一个强制正确的'this'上下文的闭包 - 一些框架为此提供了便利功能):

var self = this
this.ajax_request.onreadystatechange = function () {
   self.process_AJAX()
}

你甚至可以使用双重绑定,但是......快乐编码: - )