PhoneGap上的Ajax不会返回值

时间:2012-03-07 11:50:38

标签: javascript ajax function cordova

这感觉就像一个相当noob的问题,但是到底是什么。我正坐在PhoneGap项目中并遇到一些问题。 我按照ajax(http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample)的小型twitterfeed教程,它就像一个魅力。但是,我正在编写一个用于登录,注销等等的小型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变量首先发出警报,然后数据['BOOL']发出警报。

所以问题是函数在获取数据之前返回undefined。如何使函数“等待”返回此值,直到它运行onreadystatechange东西?

编辑:解决它的一种方法是在函数外部声明一个变量,例如“var IsUserOnline = false;”然后在函数中当它完成请求时设置“IsUserOnline = data ['BOOL']:”并且稍后在代码中使用这个变量。但是,不,我认为回归思维会是最好的。我认为将来通过此功能获取/发布更多内容时,我的代码会非常混乱。也许这只是我认为现在真的错了?

2 个答案:

答案 0 :(得分:1)

您可以在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();
    }
}

答案 1 :(得分:0)

如果我理解正确您正在尝试调用同步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参数,并在响应处理时调用回调。