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