我使用three.js加载了一个obj文件我尝试获取它的顶点"X"位置,并将其保存在init((函数中的objloader函数内的"pos"中。我想在另一个函数中使用变量的值,比如displayposition((当我尝试时
var pos;
function init() {
var objLoader = new THREE.OBJLoader();
objLoader.load('objectfile.obj', function(object) {
scene.add(object);
pos = scene.children[5].children[0].geometry.attributes.position.getX(0);
console.log(pos); //This displays the vertex position value
});
}
function displaypos() {
console.log(pos); //It doesn't display the vertex position value
}
如何使其全局化,并使变量值"pos"在整个程序中可用。。
OBJLoader.load
是一个异步函数,用于下载和解析OBJ文件。这可能根本不需要时间,也可能需要几秒钟。
您说您正在呼叫init
,然后立即呼叫displaypos
。这些函数调用是连续的,因此displaypos
将在init
退出后立即调用。
这里的操作顺序是:
- 创建全局变量
pos
- 定义
init
函数 - 定义
displaypos
函数 - 致电
init
- 将
objloader
定义为THREE.OBJLoader
- 定义
objLoader.load
的回调 - 调用
objLoader.load
<--这是异步的,可能需要一些时间 init
退出,因为对objloader.load
的调用与回调是连续的
- 将
- 致电
displaypos
- 将
undefined
打印到控制台
- 将
几秒钟后
- 调用
objloader.load
的回调- 将
object
添加到scene
- 设置
pos
的值 console.log
将正确的值打印到控制台
- 将
所以您的displaypos
调用没有打印值,因为没有要打印的值。。。然而
您可以将自己的回调添加到init
中,使其按预期工作,也可以重新编写代码以使用Promise
+async
/await
。
回调版本
var pos;
function init(callback) {
var objLoader = new THREE.OBJLoader();
objLoader.load('objectfile.obj', function(object) {
scene.add(object);
pos = scene.children[5].children[0].geometry.attributes.position.getX(0);
console.log(pos); //This displays the vertex position value
callback(); // The real exit point
});
}
function displaypos() {
console.log(pos);
}
init(function(){
displaypos(); // will now display the correct value
});
// alternately: init(displaypos);
Promise+async/await
var pos;
async function init() {
return new Promise(function(resolve){
var objLoader = new THREE.OBJLoader();
objLoader.load('objectfile.obj', function(object) {
scene.add(object);
pos = scene.children[5].children[0].geometry.attributes.position.getX(0);
console.log(pos); //This displays the vertex position value
resolve(); // the real exit point
});
});
}
function displaypos() {
console.log(pos);
}
(async function(){
await init();
displaypos(); // will display the correct value
})();