Jquery Ajax / getJSON Javascript问题

时间:2011-09-01 16:13:32

标签: javascript jquery ajax json getjson

我仍在努力解决这一切,我遇到了一个非常奇怪的错误。

我使用的是getJSON但是在搜索了这个问题的解决方案后,我发现尝试使用AJAX函数更好(用于错误捕获 - >这不是解雇)。

在firebug中使用断点,如果我慢慢浏览正在运行的代码,它(通常)工作正常(只需更改一些坐标以获得更好的绘图)。但是如果我让它以正常速度运行,它会在返回json对象之前尝试进行回调。 firebug控制台说一切正常(代码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;

发送的JSON:

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

现场演示:

http://www.schennshome.net/medicalmmj/practice/index.html(代码远非完美,我正在通过它来尝试捕捉动画之前的各种错误,但是无法通过它。)

1 个答案:

答案 0 :(得分:1)

我已经挖掘了您的源代码,问题实际上并未显示在您的问题中。问题出在这一行,它跟随你的Ajax调用:

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

game.pship是指ajax调用返回的数据,但由于这是异步的,因此将首先评估上面的行,这意味着将不会定义game.pship

要解决此问题,您需要在init回调中直接包含当前位于ajax调用之下的success函数中的所有代码。这将阻止在返回ajax调用之前评估代码。

它与断点一起使用的原因是这会中断评估,这允许在引用game.pship之前完成ajax调用。

修改

我现在在第489行收到错误,指出player_ship未定义。这又是因为异步代码的评估顺序。问题是player_ship现在正在init中的ajax函数中定义,但在此回调之外的gameLoop中被引用。

这就是我重写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调用之后执行。