如何修复此错误:未捕获(承诺)类型错误:无法读取未定义的属性(读取“长度”)

Posted

技术标签:

【中文标题】如何修复此错误:未捕获(承诺)类型错误:无法读取未定义的属性(读取“长度”)【英文标题】:how fix this error:Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length') 【发布时间】:2022-01-05 12:40:25 【问题描述】:

我正在创建一个加载 gltf 3d 模型的网站。我想使用循环加载更多模型。

const loader = new GLTFLoader()
//.setPath( 'models/gltf/DamagedHelmet/glTF/' );
      .setPath( 'resources/' );
const resourceData = ["Learning Bee1","Learning Bee2","Learning Bee3"];
//const l = resourceData.length;

for(let i=0; i<resourceData.length;i++)
    let oResource = resourceData[i];
    let sModelName = oResource + ".gltf";
    loader.load( sModelName, function ( gltf ) 

        gltf.scene.traverse( function ( child ) 

            if ( child.isMesh ) 

                roughnessMipmapper.generateMipmaps( child.material );

            

        );
    );

    scene.add( gltf.scene );

    roughnessMipmapper.dispose();

    render();



);

当我运行这个时,显示如下错误。如何解决这个问题?

three.module.js:38723 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length') 在三个.module.js:38723

【问题讨论】:

查看代码,如果你会正确缩进,你会发现scene.add( gltf.scene ); 在定义gltf 的代码之外。 【参考方案1】:

你的代码缩进有点草率,它会让你犯下可以通过更简洁的代码避免的错误。

    您在括号外调用gltf.scene,但它不存在:
loader.load( sModelName, function ( gltf ) 
    // gltf exists here
);

// gltf does not exist here
scene.add( gltf.scene );
    您在使用roughnessMipmapper 之前将其丢弃。请记住,加载器中的回调函数需要一些时间才能执行,因为它正在等待完成加载您的资产。
loader.load( sModelName, function ( gltf ) 
    // 2. This happens later, after assets load
    roughnessMipmapper.generateMipmaps( child.material );
);

// 1. This gets called first
roughnessMipmapper.dispose();

【讨论】:

以上是关于如何修复此错误:未捕获(承诺)类型错误:无法读取未定义的属性(读取“长度”)的主要内容,如果未能解决你的问题,请参考以下文章

错误::未捕获(承诺中)类型错误:无法读取未定义的属性“内容”

未捕获(承诺中)类型错误:无法读取未定义的属性“uid”

未捕获(承诺中)类型错误:无法读取未定义的属性“协议”

如何修复未捕获的类型错误:无法读取 null 的属性“值”

在与 API 调用关联的函数中:未捕获(承诺中)类型错误:无法读取未定义的属性“包含”

VueJS 3 / 路由器 / 带有推送的重定向:未捕获(承诺中)类型错误:无法读取未定义的属性(读取“推送”)