[英]Ajax on PhoneGap will not return value
這聽起來像是一個很菜鳥的問題,但到底是什么。 我坐在一個PhoneGap項目上,遇到了一些問題。 我遵循了有關使用ajax的小型twitterfeed的教程(http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample),它的工作原理很吸引人。 但是,我正在編寫一個用於登錄,注銷等的小API,而我幾乎可以正常工作了。
我將解釋我的問題:我設置了一個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”(我在其中打印“ return data ['BOOL'];”-php返回json字符串),我將得到true或false值。 如果我隨后對函數b變量AND發出了警報,則b變量首先警報,然后data ['BOOL']警報。
因此,問題在於該函數在獲取數據之前返回未定義。 我如何使函數“等待”返回該值,直到它運行了onreadystatechange東西?
編輯:一種解決方法是在函數外部聲明一個變量,例如“ var IsUserOnline = false;”。 然后在完成請求的函數中設置“ IsUserOnline = data ['BOOL']:”,然后在代碼中稍后使用此變量。 但是,不,我認為回報率最好。 我認為將來通過此功能獲取/發布更多內容時,我的代碼將變得非常混亂。 也許這只是我的想法,現在真的錯了嗎?
您可以在onreadystatechange函數中調用該函數。
在您的代碼中(請參閱我添加的注釋):
function Do_Ajax(what)
{
var ajax = new XMLHttpRequest();
//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'];
}
//CALL YOUR FUNCTION HERE,
//OR THE CODE WHAT NEEDS TO HAPPEN AFTER A VALUE HAS BEEN RECEIVED
//BY THE AJAX REQUEST
}
}
if(what == "isloggedin")
{
ajax.open("GET", root() + "/?isloggedin",true);
ajax.send();
}
}
如果我理解正確,那么您正在嘗試調用同步ajax調用,但是給定的功能仍在使用異步方式,因此您將不會收到正確的數據。 試試jQuery AJAX Promise函數,它可以幫助您調用ajax請求是同步模式。
http://www.erichynds.com/jquery/using-deferreds-in-jquery/
http://intridea.com/posts/fun-with-jquery-deferred
如果你不使用jQuery,那么你可能需要添加一個callback
后的參數what
,並呼吁響應處理回調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.