2010-10-24 98 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