2011-09-01 61 views
0

我仍然試圖弄清楚所有這一切,我遇到了一個非常奇怪的錯誤。Jquery Ajax/getJSON Javascript問題

我正在使用getJSON,但在搜索這個問題的解決方案後,我發現最好嘗試使用AJAX函數(用於錯誤捕獲 - >哪個不是正在觸發)。在螢火蟲中使用斷點,如果我慢慢地通過運行的代碼,它的工作(大部分)很好(只需要改變一些座標爲更好的繪圖)。但是如果我讓它以正常速度運行,它會在返回json對象之前嘗試執行回調。螢火蟲控制檯表示一切正常(代碼200),但是當檢查ship對象/函數內部的jobj時,它似乎是「未定義或爲空」

在斷點之後,ajax調用似乎會「出錯」而不是「成功」。但它不是發射警報...

此外,響應需要300-500ms ....是正常的?還是我需要找到更好的服務器?

編輯代碼:

var init = (function(){ 
      thisplayer = new player(); 
      jQuery.ajax({type: "GET", url: "shipdata.php", processData: true, data: {shipid:1}, dataType: "json", 
       success: function(json) { 
        var pship = new ship(json); 
        player_ship = $.extend(thisplayer, pship); 
        starfield = new starfield(); 
        for(var i = 0; i < player_ship.enemytotal; i++) { 
          $.ajax({ 
           type: "GET", 
           url: "shipdata.php", 
           processData: true, 
           data: {shipid:Math.round((Math.random()*2+2))}, 
           dataType: "json", 
           success: function(json) { 
            var enemy = new ship(json); 
            game.enemies.push(enemy); 
           }, 
           error: function(x,y,z) { 
           // x.responseText should have what's wrong 
            alert(x.responseTest); 
           } 
          }); 
         } 
        game.initialized = true; 
       }, 
       error: function(x,y,z) { 
       // x.responseText should have what's wrong 
        alert(x.responseTest); 
       } 
      }); 


     }) 

..............................

var ship = (function(json){ 
     var self = this; 
     jobj = jQuery.parseJSON(json.responseText); 
     self.height = jobj.height; 
     self.width = jobj.width; 
     self.xinit = jobj.xinit; 
     self.yinit = jobj.yinit; 
     self.speed = jobj.speed; 
     self.weapons = jobj.weapons; 
     self.maxlasers = jobj.maxlasers; 
     self.imagesrc = jobj.imgurl; 
     self.lasers = []; 
     self.x = self.xinit; 
     self.y = self.yinit; 

{"height":75,"width":50,"xinit":275,"yinit":525,"speed":3,"weapons":[1,2],"maxlasers":2,"imgurl":"images\/ship.png"} 

現場演示:

JSON在發送(代碼遠沒有完美,我試圖通過它來試圖捕捉動畫之前的各種錯誤,但無法克服這個問題。)

回答

1

我挖過​​你的源代碼,問題其實並不是真的顯示在你的問題。問題是這條線,它遵循你的Ajax調用:

player_ship = $.extend(thisplayer, game.pship); 

game.pship是指由AJAX調用返回的數據,但由於這是異步的,上面的線將首先評估,這意味着game.pship不會被定義。

要解決此問題,您需要在init函數中包含當前低於ajax調用的所有代碼,直接在success回調函數中調用。這將阻止在ajax調用返回之前對代碼進行評估。

它與斷點一起工作的原因是,此中斷評估允許在引用game.pship之前完成ajax調用。

編輯

我現在上線489得到一個錯誤,說明player_ship是不確定的。這又是因爲異步代碼的評估順序。問題是現在在init中正在定義player_ship內部的ajax函數,但在此回調之外的gameLoop中引用了player_ship

這是我會怎樣改寫gameLoop

var callback = function() { 
    game.canvas.clearCanvas(); 
    drawStarfield(); 

    if(player_ship.alive && game.initialized && !(game.loading)) { 
    drawPlayer(); 
    drawLaser(); 
    drawEnemies(); 
    } 
}; 

if(game.initialized==false) { 
    init(callback); 
} else { 
    callback(); 
} 

,然後修改init接受這被稱爲在你success回調的底部的回調方法。這樣,如果遊戲尚未初始化(並且player_ship尚未定義),它將在ajax調用之後執行。

+0

ahhhhhhhhhhhhhhhhh謝謝!!!! – Schenn

+0

我做到了這一點,我仍然得到同樣的問題,它發送空函數的船功能..? – Schenn

+0

aha,它將json解釋爲非字符串。價值絃樂。修復 – Schenn