2010-10-24 126 views
0

我是AJAX的新手,并且有此问题。AJAX(XMLHTTPRequest)时间延迟

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

     } 
    } 
} 

所以,这里是我的问题:

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

我的代码中的任何建议或错误,以解决这个问题将不胜感激。

如果您有任何问题,请发表回复。

谢谢。

回答

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

快乐编码

编辑/ PS你也可以写的AJAX处理程序一样(它只是一个封闭,迫使正确的“这个”背景 - 一些框架提供便利功能这一点)。

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

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

+0

谢谢你的建议。我没有你能做到这一点。但是,这仍然不能解决问题。我仍然需要等待。什么导致swap_dissolve()不能马上工作? – miki725 2010-10-24 21:30:56

+0

@ miki725现在,什么值你没有看到更新? – 2010-10-24 22:23:09

+0

我刚刚实现了关于onreadystatechange = function()的最后一个建议......并且似乎解决了这个问题。非常感谢你。 – miki725 2010-10-25 00:17:43