javascript:json响应没问题。使用var是错误的

时间:2013-03-06 16:24:52

标签: javascript android json cordova

情况如下。我在phonegap / jquerymobile中有一个应用程序。我想根据json数据更改页面。

当用户启动应用但当前版本不是最新版本时,需要更改内容。这是start.html页面中的代码片段。

<script type="text/javascript" charset="utf-8">
var versionValue = ServerSettings.versionCheck();
if(versionValue == true){   
    $("#loginPage").removeClass("hidden");
            $("#updatePage").addClass("hidden");    
}
else{
            $("#loginPage").addClass("hidden");
            $("#updatePage").removeClass("hidden");
}
</script>

ServerSettings.versionCheck()函数位于下方。

versionCheck : function() {
        var localAppVersion = 0.8;
        var response = false;
        $.ajax({
                async: false,
                type: "GET",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                url: "http://xxx/service/version.php",
                success: function(jsonData) {
                    var currentAppVersion = jsonData.version;
                        if(localAppVersion == currentAppVersion){
                            response = true;
                        }
                        else{
                            response = false;
                        }
                }                       
        });
                    return response;
    }

我已经用toast验证了json调用的响应。它确实得到了正确的反应。(版本:0.9)我很确定我犯了最愚蠢的错误,但我似乎无法找到它。

4 个答案:

答案 0 :(得分:1)

您正在尝试同步,但config参数评估为true,因为它是一个字符串

async: "false"

将其更改为async: false,但我建议您切换到异步以避免阻止用户界面。

此外,您的成功回调不会返回到外部方法,因此您将始终未定义。

versionCheck : function() {
    var localAppVersion = 0.8;
    var response = false;
    $.ajax({
            // WARNING: I don't recommend setting this to false in production code
            // While the browser is waiting for the response the page/browser will not respond!!
            async: false,
            type: "GET",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "http://xxx/service/version.php",
            success: function(jsonData) {
                var currentAppVersion = jsonData.version;
                response = localAppVersion == currentAppVersion;
            }                       
    });
    return response;
}

使其异步(推荐方法

versionCheck : function(checkCompleteCallback) {
    var localAppVersion = 0.8;
    $.ajax({
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "http://xxx/service/version.php",
            success: function(jsonData) {
                var currentAppVersion = jsonData.version;
                checkCompleteCallback(localAppVersion == currentAppVersion);
            }
    });
}

// Now the check accepts a callback function that executes when the request completes without blocking the UI
ServerSettings.versionCheck(function(versionValue) {
    if(versionValue){   
        $("#loginPage").removeClass("hidden");
        $("#updatePage").addClass("hidden");    
    }
    else {
        $("#loginPage").addClass("hidden");
        $("#updatePage").removeClass("hidden");
    }
});

答案 1 :(得分:0)

Ajax以异步方式工作,因此当您进行检查时,实际上还没有到达响应。将依赖于该值的逻辑放在ajax回调中。

versionCheck : function() {
    var localAppVersion = 0.8;
    $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "http://xxx/service/version.php",
            success: function(jsonData) {
                var currentAppVersion = jsonData.version;

                if(localAppVersion == currentAppVersion){   
                    $("#loginPage").removeClass("hidden");
                    $("#updatePage").addClass("hidden");    
                }
                else {
                    $("#loginPage").addClass("hidden");
                    $("#updatePage").removeClass("hidden");
                }
            }                       
        });
    }

答案 2 :(得分:0)

版本检查是异步调用。所以,它不会返回真或假。您的versionValue不会是真或假。最好使用promises进行异步调用。

像这样更改你的versionCheck功能

 versionCheck : function() {
            var localAppVersion = 0.8;
            var response = false;
            $.ajax({
                    async: "false",
                    type: "GET",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: "http://xxx/service/version.php",
                    success: function(jsonData) {
                        var currentAppVersion = jsonData.version;
                            if(localAppVersion == currentAppVersion){
                                return true;
                            }
                            else{
                                return false;
                            }
                    }                       
            }).done(function(){
                 if(versionValue == true){   
                    $("#loginPage").removeClass("hidden");
                    $("#updatePage").addClass("hidden");    
                 }
                else{
                     $("#loginPage").addClass("hidden");
                     $("#updatePage").removeClass("hidden");
               }    
           });
        }

jQuery.promise版本&gt; 1.6

答案 3 :(得分:0)

这是因为您尝试访问尚未从服务器返回的值,因为您正在使用异步。

您可以重构版本检查以获取类似的回调参数。

<script type="text/javascript" charset="utf-8">

     var localAppVersion = 0.8,
         versionValue =false;
     var versionValue = ServerSettings.versionCheck(function(jsonData){

        var currentAppVersion = jsonData.version;
                    if(localAppVersion == currentAppVersion){
                        versionValue = true;
                    }
                    else{
                        versionValue = false;
                    }

        if(versionValue == true){   
           $("#loginPage").removeClass("hidden");
           $("#updatePage").addClass("hidden");    
        }else{
           $("#loginPage").addClass("hidden");
           $("#updatePage").removeClass("hidden");
     }
   });

versionCheck : function(callback) {
    var localAppVersion = 0.8;
    var response = false;
    $.ajax({
            async: "false",
            type: "GET",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "http://xxx/service/version.php",
            success: callback                
    });
}