這聽起來像一個相當小巧的問題,但是到底是什麼。我坐在一個PhoneGap項目中,並遇到一些問題。 我跟着一個Ajax的小twitterfeed(http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample)的教程,它的作品就像一個魅力。但是,我正在編寫一個用於登錄,註銷等的小API,並且我幾乎可以實現它的工作。PhoneGap上的Ajax不會返回值
我會解釋我的問題: 我設置了一個BOOL變量,「b」確定用戶是否登錄。
var b = Do_Ajax('isloggedin');
和功能看起來幾乎完全一樣:
function Do_Ajax(what)
{
var ajax = new XMLHttpRequest();
if(what == "isloggedin")
{
ajax.open("GET", root() + "/?isloggedin",true);
ajax.send();
}
//Get the results back
ajax.onreadystatechange=function()
{
if(ajax.readyState==4 && (ajax.status==200||ajax.status==0))
{
eval('var data = ' + ajax.responseText + ';');
var theResults = data.results;
if(data['BOOL'] != null)
{
return data['BOOL'];
}
}
}
}
如果我現在嘗試在這個變量的警報(b)中,我得到「未定義」。如果我將「return」更改爲「alert」(我打印「返回數據['BOOL'];」 - php返回一個json字符串),我將得到真或假的值。如果我然後對函數中的b變量AND發出警報 - b變量首先發出警報,然後發出數據['BOOL']警報。
所以問題是函數在獲取數據之前返回undefined。我如何使函數「等待」返回這個值,直到它已經運行onreadystatechange的東西?
編輯:解決它的一種方法是聲明一個變量外的函數,如「var IsUserOnline = false;」然後在函數完成請求時設置「IsUserOnline = data ['BOOL']:」,稍後在代碼中使用這個變量。但是,我認爲迴歸思考是最好的。我想我的代碼在將來會非常混亂,當我通過這個函數獲取/發佈更多的東西時。也許這只是我的想法現在真的錯了?
嘿,謝謝你的回覆。但是我應該調用什麼函數?呼喚自己?在請求之後我想要發生什麼,Do_Ajax應該返回數據['BOOL']的值。現在它只是返回undefined,因爲它在onreadystatechange東西運行之前返回一個值。 – Linus 2012-03-07 13:10:20
我想你應該調用一個不同的函數。您初始化ajax請求,並在onreadystate中將您希望運行的代碼放入ajax結果中。 - 你也可以嘗試在onreadystatechange之後放置'if(logged_in)'部分。 – Jozzeh 2012-03-09 08:24:20
看到我編輯的回覆(替換爲「if-isloggedin」 – Jozzeh 2012-03-09 12:25:17