OBJLoader.load
- это асинхронная функция, которая загружает и анализирует файл OBJ. Это может занять совсем немного времени или несколько секунд.
Вы говорите, что звоните init
, за которым сразу следует displaypos
. Эти вызовы функций являются последовательными, поэтому displaypos
будет вызываться сразу после выхода init
.
Порядок операций здесь такой:
- Создайте глобальная переменная
pos
- Определить функцию
init
- Определить функцию
displaypos
- Вызов
init
- Определить
objloader
как a THREE.OBJLoader
- Определение обратного вызова для
objLoader.load
- Вызов
objLoader.load
<- это асинхронно и может занять некоторое время </strong> init
выходит , поскольку вызов objloader.load
был последовательным с обратным вызовом
- Вызов
displaypos
- Печать
undefined
на console
Через несколько секунд ...
- Обратный вызов для
objloader.load
называется - Добавить
object
к scene
- Установить значение
pos
console.log
выводит правильное значение на консоль
Таким образом, ваш displaypos
вызов не печатает значение, потому что нет значения val Вы можете напечатать ... пока.
Вы можете добавить свой собственный обратный вызов к 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);
Обещание + асинхронное / ожидание
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
})();