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

异步函数回调内复制对象到外部变量 读取时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:06:05