2011-08-14 54 views
0

嗨,我不確定如何描述這個問題,所以我希望代碼將解釋我的問題。由ajax函數調用的php腳本(phppage.php)除了echo hello world之外沒有任何其他功能。Javascript AJAX類問題

當警報('a')行留在使用ajax函數的調用函數中時,代碼將按預期工作,最後一行彈出消息「hello world」。然而,alert('a')行被註釋掉了,那麼最後一行不會給出「hello world」,而是值13,就像在構造函數中設置的一樣。

我在Firefox 3.6.18

嘗試任何幫助,這將衷心感謝。

function A() { 
    this.b = 13; 
    function finish(context,response) { 
     context.b = response; 
    } 
    ajax(finish,this); 
} 

A.prototype = { 
    constructor: A 
} 

function ajax(callback,context) { 
    var http = new XMLHttpRequest(); 
    var url = "phppage.php"; 
    http.open("GET", url, true); 
    http.onreadystatechange = recall; 
    function recall() { 
     alert('a'); 
     if(http.readyState == 4 && http.status == 200) { 
      callback(context,http.responseText); 
     } 
    } 
    http.send(null); 
} 

var d = new A(); 
alert(d.b); 
+0

剛剛測試這對鉻,它不無論是否存在警報('a'),都可以工作。 – Dom

+0

我想我明白這裏發生了什麼。最後一行警報(d.b)在ajax調用可以返回並調整對象屬性之前執行。 – Dom

回答

1

我看到你的代碼有幾個問題。首先是你的完成功能,你正在做什麼與上下文變量是非常差的風格和JavaScript有一個功能稱爲closures,將清理你的東西。您的構造函數應該看起來更像這樣:

function A() { 
    this.b = 13; 
    //this is how you should be storing contexts 
    var that = this; 
    function finish(response) { 
     that.b = response; 
    } 
    ajax(finish); 
} 

即使在構造函數A返回後,finish也將可以訪問它。你也不需要你在A下的原型。這實際上沒有做任何事情。

最後,我們可以整理你的AJAX功能了一點,所以它看起來像這樣:

​​

注意,這是所有未經測試的代碼,所以不能保證它會工作,但我認爲這將指向你在正確的方向。

編輯:

現在,我看看你的代碼,我意識到,這可能是異步工作它只是你調用AJAX所以它立即返回,你是呼應b的值,你拿回來前。

可能也想嘗試:

http.open("GET", url, false); 

(但上述所有我的意見還是應該考慮,因爲他們會很乾淨了一點東西)

+0

感謝您的反饋,這真的很有幫助。最後一點是關於異步性的點。我發現了這一點,並添加了對我原來的帖子的評論。此外,原型行來自「JavaScript - 權威指南」第6版,其中說沒有原型的構造函數將創建沒有構造函數屬性的對象。 – Dom