异步函数回调内复制对象到外部变量 读取时出现undefined/null问题
问题根源
你遇到的是异步代码执行顺序问题:
client.get属于异步IO操作,你传入的回调函数会被暂时挂起,等请求拿到结果后才会执行- 函数内的
console.log('p1',p1)是同步代码,会在回调函数执行前就运行,此时你对p1的赋值操作还没有触发,所以拿到的始终是初始值。
解决方案
方案1:将p1的后续操作移入回调内部
所有需要用到p1的逻辑都放在client.get的回调函数中,保证赋值完成后才执行相关操作:
display = () => { client.get('results', (err, results) => { console.log('res1',results); const p1 = JSON.parse(JSON.stringify(results)); // 所有使用p1的逻辑都写在这里 console.log('p1',p1); }); }
方案2:封装为Promise配合async/await使用
如果要适配你已经声明的async函数写法,可读性更高:
// 先将callback风格的client.get封装为返回Promise的方法 const getClientResults = () => { return new Promise((resolve, reject) => { client.get('results', (err, results) => { if (err) return reject(err); resolve(results); }); }); }; display = async () => { try { const results = await getClientResults(); const p1 = JSON.parse(JSON.stringify(results)); // 后续可以正常使用p1 console.log('p1', p1); } catch (err) { // 处理请求错误 console.error('请求失败', err); } }
补充说明:如果
results本身就是可直接使用的普通JS对象,且你不需要切断引用关联的话,可以直接赋值const p1 = results,不需要走JSON序列化反序列化的深拷贝操作。
内容的提问来源于stack exchange,提问作者Usman
相关产品推荐
相关产品推荐

