为什么这个非常明确定义(在回调JSONLoader中)对象读取为undefined?

时间:2014-07-13 05:35:14

标签: javascript callback three.js

为什么这个THREE.Mesh()对象在THREE.JSONLoader()中明确定义时是未定义的? 这是我的代码......

1: var player;
2: var playerCallback = function(geo, mats){
3:     player = new THREE.Mesh(geo, new THREE.MeshFaceMaterial(mats));
4:     console.log("Loaded Model: " + 'resources/models/Player.js');
5: }
6: JSONLoader.load('resources/models/Player.js', playerCallback);
7: player.position.set(0, 20, 20);
8: player.physics = false;
9: scene.add(player);

我得到的错误是针对“ 7 ”行,因为该播放器未定义。 在此之前,“已加载的模型:resources / models / Player.js ”显示为应该如此。

1 个答案:

答案 0 :(得分:0)

因为它是在执行playerCallback块之前执行的。

JSONLoader加载外部文件,但这需要时间。在等待加载该文件时,它继续执行您的脚本。

因此,在加载外部文件时,它会尝试访问未定义的变量(播放器)。为了使其正常工作,您需要确保您的程序仅在定义后才尝试访问全局播放器。

要修复代码,请执行以下操作:

var player;
var playerCallback = function(geo, mats){
    player = new THREE.Mesh(geo, new THREE.MeshFaceMaterial(mats));
    console.log("Loaded Model: " + 'resources/models/Player.js');

    performPlayerActions();
}

JSONLoader.load('resources/models/Player.js', playerCallback);

function performPlayerActions() {
    player.position.set(0, 20, 20);
    player.physics = false;
    scene.add(player);
}

我所做的就是将您的播放器代码移动到另一个函数中,然后在我们确定已经定义了播放器之后(在加载外部文件之后)调用它。