簡體   English   中英

PhoneGap上的Ajax將不會返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM