[英]How can I wait until my AJAX request is complete?
因此,我有一个init函数在DOM完全加载时运行:
function init()
{
TerrainObj.load_terrain();
TerrainObj.generate_display_layer(PlayerObj);
GameObj.update();
ScreenObj.draw_screen(TerrainObj);
ScreenObj.update_screen(TerrainObj);
mainloop();
}
第一个方法TerrainObj.load_terrain()
发出AJAX requestL:
load_terrain: function()
{
var settings = {
type: "GET",
url: "data/map.txt",
aysnc: false
};
$.ajax(settings).done(function(result)
{
this.terrain = result.split("\n");
for (var i = 0; i < this.terrain.length; i++)
{
this.terrain[i] = this.terrain[i].split("")
}
console.log(this.terrain);
});
}
问题在于,在我们的init()
函数中,遵循TerrainObj.load_terrain()
大多数方法都需要TerrainObj.terrain array
的存在,但是在AJAX请求可以完成并填充该变量之前会调用它们。 当每个函数运行以检查顺序时,我都会提示一些信息,得到的是:
Ran TerrainObj.load_terrain()
Ran ScreenObj.draw_screen()
Uncaught TypeError: Cannot read property '0' of undefined
[Array[55], Array[55], ... ]
因此,您可能已经看到,需要TerrainObj.terrain的ScreenObj.draw_screen
已在请求完成之前运行,并且在尝试引用我们的对象时发生TypeError
。 还没准备好! 最后一条消息是来自load_terrain
方法的console.log()
,指示.done
函数此后运行。
在继续执行我的程序之前,我该怎么做直到AJAX请求完成?
Javascript是一种事件驱动的语言。 您没有主循环,但是您有触发事件的事件。
在这里,ajax调用的完成触发了随后的地形设置。 因此将函数分为两个部分:
init: function()
{
TerrainObj.load_terrain();
},
init_terrain: function()
{
TerrainObj.generate_display_layer(PlayerObj);
GameObj.update();
ScreenObj.draw_screen(TerrainObj);
ScreenObj.update_screen(TerrainObj);
mainloop();
},
load_terrain: function()
{
var settings = {
type: "GET",
url: "data/map.txt",
aysnc: false
};
$.ajax(settings).done(function(result)
{
this.terrain = result.split("\n");
for (var i = 0; i < this.terrain.length; i++)
{
this.terrain[i] = this.terrain[i].split("")
}
this.init_terrain();
});
}
检查下面的代码块中的注释部分
$.ajax(settings).done(function(result)
{
this.terrain = result.split("\n");
for (var i = 0; i < this.terrain.length; i++)
{
this.terrain[i] = this.terrain[i].split("")
}
/*******************************************/
//Place a new function call here, to the function that contains the calls to your
//functions, or other logic, that require the array to be populated.
/*******************************************/
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.