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

JavaScript 从Promise对象获取数据赋值后变量为undefined问题

问题原因

你遇到的是典型的Promise异步执行顺序问题:

  • FBInstant.player.getDataAsync() 是异步方法,调用后不会立刻执行then里的回调函数,JS会先执行后续的同步代码(也就是你的console.log(User['name'])),这时候回调还没执行,User['name'] 自然是undefined。
解决方法

方法1:在then回调内处理后续逻辑

所有需要用到User.name的逻辑,都直接放到then回调里执行,保证获取到数据后再运行对应的逻辑:

User = [];
FBInstant.player.getDataAsync(['name']).then(function(data) {
    User['name'] = data['name'];
    // 所有需要用到User.name的逻辑都写在这里
    console.log(User['name']);
    // 调用其他依赖该数据的函数也可以放在这里
    dealWithUserData(User);
});

方法2:使用async/await语法(更简洁)

如果你的运行环境支持ES7的async/await语法,可以使用这种更贴近同步代码书写习惯的写法:

// 逻辑需要放到async修饰的函数内部
async function fetchUserData() {
  const User = [];
  const data = await FBInstant.player.getDataAsync(['name']);
  User['name'] = data['name'];
  // 后续可以直接在这里使用User.name
  console.log(User['name']);
  return User;
}
// 调用async函数时也可以用then获取返回值处理后续逻辑
fetchUserData().then(User => {
  // 这里也可以处理数据获取完成后的其他逻辑
});
注意点
  • 不要尝试把异步获取到的值赋值给全局变量后,在同步代码里直接访问,一定会出现undefined的问题,所有依赖该数据的逻辑必须等待异步操作完成后再执行。
  • 数组不建议用来存键值对数据,你可以把User定义成普通对象const User = {}会更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:36:01