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;
    }

トーストでjson呼び出しの応答を確認しました。正しい応答が得られます。(バージョン: 0.9) 私はこれまでで最もばかげた間違いを犯したと確信していますが、それを見つけることができないようです。

4

4 に答える 4

1

同期しようとしていますが、構成パラメーターは文字列であるため 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

非同期を使用しているため、サーバーからまだ返されていない値にアクセスしようとしていることが原因です。

バージョンチェックをリファクタリングして、そのようなコールバック引数を取ることができます。

<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 に答える
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

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 に答える