【问题标题】:Ajax on PhoneGap will not return valuePhoneGap 上的 Ajax 不会返回值
【发布时间】:2012-03-09 20:26:52
【问题描述】:

这感觉像是一个很菜鸟的问题,但到底是什么。我正在处理一个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 变量和警报有警报 - b 变量首先警报,然后 data['BOOL'] 警报。

所以问题是函数在获取数据之前返回 undefined。我怎样才能让函数“等待”返回这个值,直到它运行了 onreadystatechange 的东西?

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

【问题讨论】:

    标签: javascript ajax function cordova


    【解决方案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();
        }
    }
    

    【讨论】:

    • 嘿,谢谢回复。但是我应该调用什么函数?调用自己?我希望在请求之后发生的是 Do_Ajax 应该返回 data['BOOL'] 值。现在它只是返回 undefined 因为它在 onreadystatechange 东西运行之前返回一个值。
    • 我认为你应该调用一个不同的函数。您初始化 ajax 请求并在 onreadystate 中放置您想要在获得 ajax 结果时运行的代码。 - 您也可以尝试将“if(logged_in)”部分放在 onreadystatechange 之后。
    【解决方案2】:

    如果我理解正确,您正在尝试调用同步 ajax 调用,但给定函数仍在使用异步方式,因此您不会收到正确的数据。试试 jQuery AJAX promise 函数,它可以帮助你调用 ajax 请求是同步模式。

    http://www.erichynds.com/jquery/using-deferreds-in-jquery/

    http://intridea.com/posts/fun-with-jquery-deferred

    如果您没有使用 jQuery,那么您可能需要在 what 之后添加一个 callback 参数并在响应处理时调用回调。

    【讨论】:

    • 您好,感谢您的回复。你能给我看一个回调的例子吗?
    猜你喜欢
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多