0

这是情况。我在 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

4 回答 4

1

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

async: "false"

将其更改为async: false,但我建议切换到异步以避免阻塞 UI。

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

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");
    }
});
于 2013-03-06T16:28:30.603 回答
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");
                }
            }                       
        });
    }
于 2013-03-06T16:30:50.190 回答
0

版本检查是一个异步调用。因此,它不会返回 true 或 false。你的versionValue意愿不真也不假。异步调用最好使用 Promise。

像这样更改您的 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适用于 > 1.6 版本

于 2013-03-06T16:32:43.660 回答
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                
    });
}
于 2013-03-06T16:36:38.933 回答