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

Angular12+Three.js环境Promise超时及Promise.all传参错误求助

Promise相关问题修复方案

错误根因

  • Promise.all参数错误:你在loadPromise方法内定义的allDone数组为局部变量,没有对外返回,调用this.loadPromise()无法拿到该数组,Promise.all()未接收到必填的promise可迭代参数,触发参数校验报错。
  • 3000ms超时错误:你创建资源加载Promise时,仅在成功回调中引用了resolve函数,没有实际执行该函数(错误写法为.then(() => resolve),正确应为.then(() => resolve())),导致所有Promise长期处于pending状态,超出FontFaceObserver默认3秒的超时阈值后抛出异常。另外现有代码中的加载成功日志为同步执行,无法真实反映资源的实际加载状态。

小优化:如果你的字体资源体积较大,可在load方法中传入第二个参数自定义超时时长,例如new FontFaceObserver("Open Sans").load(null, 5000)即可将超时时间调整为5秒。

修正后代码

1. 修正loadPromise方法

loadPromise() {
  const fontOpen = new Promise((resolve, reject) => {
    new FontFaceObserver("Open Sans").load().then(() => {
      console.log('Output Open Sans has loaded.');
      resolve();
    }).catch(reject);
  })

  const fontPlayfair = new Promise((resolve, reject) => {
    new FontFaceObserver("Playfair Display").load().then(() => {
      console.log('Output Playfair Display has loaded.');
      resolve();
    }).catch(reject);
  })

  // 预加载图片
  const preloadImages = new Promise((resolve, reject) => {
    imagesLoaded(document.querySelectorAll("img"), { background: true }, () => {
      console.log("Output img has loaded.")
      resolve();
    });
  });

  return [fontOpen, fontPlayfair, preloadImages];
} 

2. 修正onPageLoad方法

ngOnInit(): void {
  this.onPageLoad();
}

onPageLoad(options) {
  const promiseList = this.loadPromise();
  Promise.all(promiseList).then(() => {
    this.resize();
    this.setupResize();
    this.addObjects();
    this.render();
  }).catch(err => {
    // 可在此处添加资源加载失败的降级处理逻辑
    console.error('资源加载异常:', err);
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:24:09