JavaScript中如何访问GLTF加载异步子函数内部的返回变量?
解决方案
问题根因
GLTFLoader.load是异步回调API,JS调用该方法后不会阻塞等待模型加载完成,会直接执行后续同步代码,因此回调内部给mesh赋值的逻辑还没触发,外层同步代码就已经读取了初始的null值。
步骤1:改造CreateMesh方法,返回Promise对象
CreateMesh(path){ return new Promise((resolve, reject) => { this.gltfLoader.load( path, (gltf) => { this.experience.scene.add(gltf.scene) // 加载成功,返回模型实例 resolve(gltf.scene) }, // 加载进度回调,不需要可省略 undefined, // 加载失败抛出错误 (error) => reject(error) ) }) }
步骤2:异步方式调用获取模型
方式1:使用async/await(推荐,可读性更高)
需要将调用CreateMesh的外层函数标记为async:
// 外层函数加async修饰 async initPlayer() { try { // 等待模型加载完成后再执行后续逻辑 const playerMesh = await this.experience.loaderGltf.CreateMesh('./../static/player.glb') this.players.push(playerMesh) // 所有需要用到playerMesh的逻辑都可以写在这里 } catch (err) { console.error('玩家模型加载失败:', err) } }
方式2:使用then链式调用
如果不想修改外层函数的声明,可以用Promise的then方法处理返回结果:
this.experience.loaderGltf.CreateMesh('./../static/player.glb') .then(playerMesh => { this.players.push(playerMesh) // 所有需要用到playerMesh的逻辑都可以写在这里 }) .catch(err => { console.error('玩家模型加载失败:', err) })
注意事项
所有依赖加载完成的模型实例的逻辑,必须写在await之后或者then的回调内部,不能在调用CreateMesh后的同步代码中直接读取,此时模型还未加载完成。
内容的提问来源于stack exchange,提问作者alon
相关产品推荐
相关产品推荐

