Forge Viewer 模型随机加载失败问题求助
Forge Viewer 动态加载多模型间歇性加载失败问题的解决
这个问题我遇到过,本质是并行加载多个模型时,Viewer的内部渲染场景(_renderScene)可能还未完成初始化,或者在多模型加载的并发逻辑中出现了状态不一致。
问题原因
你当前用models.forEach并行发起所有模型的加载请求,而loadDocumentNode是异步操作。当多个请求同时进入加载流程时,可能会有某个请求在执行hasModels检查时,Viewer的_renderScene还没完成初始化(比如第一个模型的加载还没完成,后续模型的加载流程提前触发了检查),导致抛出Cannot read properties of undefined (reading 'isEmpty')错误。
解决方案
1. 改为串行加载模型
最稳妥的方式是串行加载,确保前一个模型加载完成后再启动下一个模型的加载,完全避免并发状态冲突:
async function loadModelsInSequence(models) { for (const model of models) { const documentId = 'urn:' + model.urn; const applyRefPoint = model.applyRefPoint || false; try { // 先加载文档 const viewerDocument = await Autodesk.Viewing.Document.load(documentId); const defaultModel = viewerDocument.getRoot().getDefaultGeometry(); const globalOffset = model.globalOffset || { x: 0, y: 0, z: 0 }; const loadOptions = { keepCurrentModels: true, applyRefPoint, applyScaling: 'm', }; // 等待当前模型加载完成 await viewer.loadDocumentNode(viewerDocument, defaultModel, loadOptions); onLoad(); // 单个模型加载完成后的回调 } catch (err) { console.error('模型加载失败:', err); } } } // 调用串行加载函数 loadModelsInSequence(models);
2. 确保Viewer完全初始化后再加载
如果坚持要并行加载,至少要确保Viewer已经完成所有初始化工作后再发起请求。可以监听Viewer的VIEWER_READY事件,或者等待第一个模型加载完成后再批量加载剩余模型:
// 等待Viewer就绪 viewer.addEventListener(Autodesk.Viewing.VIEWER_READY, () => { // 在这里开始加载模型 models.forEach(model => { // 原加载逻辑... }); });
3. 封装安全的状态检查(临时 workaround)
可以对hasModels做安全封装,避免因_renderScene未初始化导致的报错,但这只是临时规避,不能从根本上解决竞态问题:
function safeHasModelsCheck(viewer) { try { return viewer.hasModels(); } catch (e) { return false; } } // 在加载逻辑中使用这个封装函数替代原生hasModels // 不过这个方法仅作为临时方案,优先推荐串行加载
总结
串行加载是解决这类间歇性并发问题最可靠的方案,Forge Viewer的多模型加载逻辑在高并发场景下偶尔会出现内部状态不一致的情况,串行加载可以完全避免这类问题。
内容的提问来源于stack exchange,提问作者LDevelop
相关产品推荐
相关产品推荐

