2012-06-05 82 views
0

我剛學習JavaScript對象併產生問題。我有下面的代碼/ JS對象:帶有重置變量的JavaScript對象

更改:這是完整的代碼 - 這是一個Appcelerator的鈦項目!:

spike.xhr = spike.xhr || {}; 

spike.xhr.init = function() { 
    this.severResponse = ''; 
    this.xhrMethod = 'GET'; 
} 

spike.xhr.isOnline = function() { 
    if(Titanium.Network.online) { 
     return true; 
    } else { 
     return false; 
    } 
} 

spike.xhr.notOnline = function() { 
    var alertDialog = Titanium.UI.createAlertDialog({ 
     title: CONFIG.PROJECT_SHORT, 
     message: 'You do not have an online connect. Please connect...', 
     buttonNames: ['Continue'], 
     cancel: 0 
    }); 
    alertDialog.show(); 
} 

spike.xhr.connect = function(url) { 

    if(spike.xhr.isOnline()) { 
     spike.xhr.clients = Ti.Network.createHTTPClient(); 

     spike.xhr.clients.onload = function() { 
      if (spike.xhr.clients.status != 200 && spike.xhr.clients.status != 201) { 
       var alertDialog = Titanium.UI.createAlertDialog({ 
        title: CONFIG.PROJECT_SHORT, 
        message: 'We are sorry, but we have received an status error!', 
        buttonNames: ['Continue'], 
        cancel: 0 
       }); 
       alertDialog.show(); 
       return false; 
      }  
      this.serverResponse = this.responseText; 
     } 

     spike.xhr.clients.onerror = function(e) { 
      Ti.API.log('ERROR: ' + e.status + ': ' + e.statusText + ' - ' + e.error); 
     } 

     spike.xhr.clients.open(this.xhrMethod, url); 

     spike.xhr.clients.send(); 
    } else { 
     spike.xhr.notOnline(); 
    } 
} 

spike.xhr.basicAuthentication = function(username, password) { 
    authstr = 'Basic ' +Titanium.Utils.base64encode(username+':'+ password); 
    spike.xhr.client.setRequestHeader('Authorization', authstr); 
} 

spike.xhr.setMethod = function(type) { 
    this.xhrMethod = type; 
} 

spike.xhr.response = function() { 
    return this.serverResponse; 
} 

如果我現在運行:

spike.xhr.connect('http://mydomain'); 
theResponse = spike.xhr.response(); 

我返回<null>! - 爲什麼我沒有收到"This is a Test!"回覆或更好的問題: 回到頂部"This is a Test!"需要更改什麼?

+0

XHR是一種XMLHttpRequest(AJAX)嗎? –

+2

請提供'spike.xhr.connect'函數的代碼 - 可能你正在尋找返回值,而ajax調用仍在運行 – fcalderan

+0

事情是,當我在this.serverResponse下面添加一個警報(this.serverRepsonse)時= 「這是一個測試!」,我正確地得到「這是一個測試!」?!?!? – codeworxx

回答

3

上述代碼不起作用的原因是因爲您的spike.xhr.connect函數是異步。這意味着您可以讓瀏覽器發出請求,但在瀏覽器等待響應返回時繼續執行其他操作。

JavaScript在一個線程中運行,這意味着您一次只能執行一件事。某些操作(如「AJAX」調用)是異步,因爲瀏覽器知道如何進行該請求,但不會阻止當前正在運行的代碼以等待請求。通常情況下,非同步碼被稱爲具有回調函數,它運行當所述請求被返回

// pseudo code. 

spike.xhr.connect('http://google.com', function (response) { 
    alert('google'); 
}); 
alert('this will fire before spike.xhr.connects callback'); 

當來自服務器的響應返回AND瀏覽器中的回調函數將被執行沒有做別的事

+1

它看起來像spike.xhr.clients.onload意圖作爲回調,但它不會調用傳入的回調,如斯坦利斯圖爾特建議。根據他的建議,在spike.xhr.clients.onload中調用第二個參數作爲函數。 – Will

+0

謝謝 - 你幫了我很多! – codeworxx