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

如何在对象中使用Promise?解决调用及结果读取报错问题

问题1:Cannot read properties of null (reading 'then') 修复方案

错误原因

代码执行时,app.tabs初始值为null,此时直接调用app.tabs.then()会报错——因为null没有then方法。而且即便后续点击事件给app.tabs赋值了Promise,初始的then调用已经执行完毕,不会再触发。

修复方案

把then的调用放到点击事件回调内,确保只有当app.tabs被赋值为Promise后,才监听它的状态:

const app = {
   tabs : null,
   ...
};

document.getElementById('myid').addEventListener('click', function() {
   app.tabs = foo();  // returns a Promise
   // 赋值后再监听Promise状态
   app.tabs.then(function() {
      bar();
   });
});

如果需要提前预留then调用的逻辑,也可以初始将app.tabs设为一个已resolved的空Promise,避免初始调用报错:

const app = {
   tabs : Promise.resolve([]), // 初始设为已resolved的Promise
   ...
};

document.getElementById('myid').addEventListener('click', function() {
   app.tabs = foo();  // returns a Promise
   app.tabs.then(function() {
      bar();
   });
});

// 此时初始调用then不会报错,仅当后续foo返回的Promise resolved时才会触发bar
app.tabs.then(function() {
   bar();
});
问题2:Cannot read properties of undefined (reading 'id') 原因及解决办法

错误原因

app.tabs存储的是Promise对象,不是Promise resolved后的结果值。哪怕Promise已经fulfilled,app.tabs[0]依然是undefined,自然无法读取id属性。

解决办法

方案1:在then回调中直接使用结果

把Promise的resolved结果作为参数传入bar,在函数内直接访问:

document.getElementById('myid').addEventListener('click', function() {
   app.tabs = foo();  // returns a Promise
   app.tabs.then(function(tabsResult) {
      // tabsResult是Promise返回的单元素数组
      bar(tabsResult);
   });
});

// 修改bar函数,接收结果参数
function bar(tabsResult) {
   console.log(tabsResult[0].id);
}

方案2:将结果存储到单独属性中

在app里新增一个属性专门存储Promise的结果,后续在bar中访问该属性:

const app = {
   tabs : null,
   tabsData: null, // 用于存储Promise的resolved结果
   ...
};

document.getElementById('myid').addEventListener('click', function() {
   app.tabs = foo();  // returns a Promise
   app.tabs.then(function(tabsResult) {
      app.tabsData = tabsResult;
      bar();
   });
});

function bar() {
   console.log(app.tabsData[0].id);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:25:06