我是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,所以来自服务器的响应已经完全返回,因此函数设置的任何值都是最终的,可以立即使用,所以为什么我不能马上使用这些值并且有等待?
我的代码中有任何建议或错误可以解决此问题。
如果您对我有任何疑问,请回复此问题。
谢谢。
答案 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()
}
你甚至可以使用双重绑定,但是......快乐编码: - )