在另一个函数中使用一个函数的变量 (Three.js) Javascript
Use variable of one function in another (Three.js) Javascript
我使用 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);
承诺 + 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
})();
我使用 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);
承诺 + 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
})();