2013-03-06 48 views
0

这里是情况。我在phonegap/jquerymobile有一个应用程序。我想根据json数据更改页面。javascript:json响应正常。与var一起工作是错误的

当用户启动应用程序,但当前版本不是最新版本时,需要更改内容。这是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)我很确定我做出了最愚蠢的错误,但我似乎无法找到它。

+1

所以哪个变量是给不正确的值? – 2013-03-06 16:26:30

+0

ServerSettings.versionCheck()始终未定义。 – Klaas 2013-03-06 16:35:49

回答

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     
    }); 
} 
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"); 
    } 
}); 
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"); 
       } 
      }      
     }); 
    } 
+0

你错过了为什么它是异步的,而不是sych。 – epascarello 2013-03-06 16:58:55

0

版本检查是异步调用。所以,它不会返回真或假。您的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

相关问题