したがって、DOM が完全にロードされたときに実行される init 関数があります。
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 リクエストを作成しますL:
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], ... ]
おそらくご覧のScreenObj.draw_screen
とおり、TerrainObj.terrain を必要とする は、リクエストが完了する前に実行さTypeError
れ、オブジェクトを参照しようとすると が発生します。まだ準備ができていません!最後のメッセージはメソッドconsole.log()
からのもので、関数が後で実行されることを示します。load_terrain
.done
プログラムを続行する前に、AJAX 要求が完了するまで待機するにはどうすればよいですか?