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

如何等待for循环完成后返回结果?GLTFLoader异步加载问题

解决GLTFLoader异步加载模型返回空数组的问题

问题出在gltfLoader.load()是异步方法——for循环只是挨个发起了加载请求,但这些请求还没完成,函数就直接返回了空的allModels数组。

要让函数等所有模型加载完再返回结果,得把每个加载操作包装成Promise,再用Promise.all()统一等待所有加载完成,同时把函数声明为async:

async function modelLoader(source) {
    const gltfLoader = new GLTFLoader()
    // 把每个资源项转成加载模型的Promise
    const modelPromises = source.map(item => {
        return new Promise(resolve => {
            const model = new THREE.Group()
            model.name = item.name
            gltfLoader.load(item.file, gltf => {
                // 将加载后的模型子节点添加到Group
                gltf.scene.children.forEach(child => model.add(child))
                // 加载完成后返回当前模型
                resolve(model)
            })
        })
    })
    // 等待所有模型加载完毕,返回完整的模型数组
    return Promise.all(modelPromises)
}

调用这个函数的时候,因为它返回的是Promise,你需要用await(在async函数内部)或者.then()来获取实际的模型数组:

// 方式1:在async函数里用await
async function initScene() {
    const loadedModels = await modelLoader(你的资源数组)
    // 这里就能拿到所有加载好的模型了
    console.log(loadedModels)
}

// 方式2:用.then()链式调用
modelLoader(你的资源数组).then(loadedModels => {
    console.log(loadedModels)
})

之前你用async/await没拿到实际值,是因为没把gltfLoader.load的回调逻辑包装成Promise,async函数里只有await Promise才能等待异步操作完成,直接await回调式方法是没用的。

内容的提问来源于stack exchange,提问作者Nico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:21:13