Javascript 等待加载完成

Javascript 等待加载完成,javascript,three.js,Javascript,Three.js,嗨,伙计们,我现在有点困了 我的问题是,在加载所有对象之前,我回到了起点 创建工具架后,我计算一个边界框,用于计算对象的位置和平移。但因为我回到了早期,我不能计算我的边界框,它说一切都是0或无穷大。 所以我需要一种方法来等待,直到所有东西都加载完毕。 我认为加载程序上的onload部分可以做到这一点,但它不起作用 以下是我的代码的相关部分: 在我的init中,我调用一个函数 let shelf = this.creators.createShelf(parts); 我的Creator类构建一个

嗨,伙计们,我现在有点困了

我的问题是,在加载所有对象之前,我回到了起点

创建工具架后,我计算一个边界框,用于计算对象的位置和平移。但因为我回到了早期,我不能计算我的边界框,它说一切都是0或无穷大。 所以我需要一种方法来等待,直到所有东西都加载完毕。 我认为加载程序上的onload部分可以做到这一点,但它不起作用

以下是我的代码的相关部分:

在我的init中,我调用一个函数

let shelf = this.creators.createShelf(parts);
我的Creator类构建一个对象

createShelf(parts) {

  let shelf= new THREE.Mesh();
  let mesh: THREE.Mesh;
  let props;
  for (let part of parts) {
    if (part.model == true) {
      let loadObject = this.helpers.loadObject(part);
      shelf.add(loadObject);
      // do stuff
      return shelf;
现在,我加载一个3d对象,这个对象是我用ThreeJS的ObjectLoader创建的

 loadObject(props: Object3D) {

    let object = new THREE.Mesh();
    let modelLoader = new THREE.ObjectLoader();
    modelLoader.load(part.modelObjPath,
        // onload
        function (obj) {
            // do stuff to the Object
            object.add(obj);  
        },
        function (xhr) {
            console.log( (xhr.loaded / xhr.total * 100) + '% ' + part.name + ' loaded' );
        },
        function (xhr) {
            console.error( 'An error happened' );
        }
    );
    return object;
}
使用Box3或BoxHelper创建的“我的边界框”将返回以下内容:

let box = new THREE.Box3().setFromObject(shelf);

bb object 
Ta {min: p, max: p}
max:
p {x: -Infinity, y: -Infinity, z: -Infinity}
min:
p {x: Infinity, y: -Infinity, z: -Infinity}
我希望我能解释我的困境


感谢您的关注。

文档已经给出了答案:

可以根据需要将管理器传递给任意多个项目,使其成为一个方便的类,以便在操纵场景和资源之前等待加载所有对象和项目。然后指定在启动、进度和加载期间要执行的操作。当管理器传入的所有项都已加载时,onLoad激发

var manager = new THREE.LoadingManager();
manager.onStart = function ( url, itemsLoaded, itemsTotal ) {

    console.log( 'Started loading file: ' + url + '.\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );

};

manager.onLoad = function ( ) {

    console.log( 'Loading complete!');

};


manager.onProgress = function ( url, itemsLoaded, itemsTotal ) {

    console.log( 'Loading file: ' + url + '.\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );

};

manager.onError = function ( url ) {

    console.log( 'There was an error loading ' + url );

};

var loader = new THREE.OBJLoader( manager );
loader.load( 'file.obj', function ( object ) {

    //

} );

您必须在
modelLoader.load
onload
中使用回调函数,否则可能会重复。或者使用承诺:
返回新承诺(res=>objectLoader.load(obj=>{object.add(obj);res(obj);})如何在加载时实现回调,您能给我举个例子吗?我现在有点傻,只是不明白这不是一个快速修复的情况,或者我只是回答你的问题,你必须回去学习如何在JavaScript中处理异步操作(一般来说)。链接的dupe是一个很好的开始,但谷歌搜索“承诺vs回调”也应该有所帮助。