You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:06:02