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
相关产品推荐
相关产品推荐

