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

Node.js异步处理场景下如何让console.log执行时mCon值为true?

Node.js 等待Socket异步响应的代码调整方案

问题本质

当前代码中socket的IO操作属于异步非阻塞逻辑,调用SendCmdSocket发送命令后,代码不会等待socket服务端返回数据,会直接执行后续的console.log语句,此时data事件尚未触发,OnReceive函数未执行,mCon的值仍为初始的false。

解决方案

将异步的socket响应过程封装为Promise,配合async/await语法实现等待socket返回结果后再执行后续逻辑,调整后代码如下:

let mCon = false;

// 封装发送命令并等待响应的异步方法
function sendCmdAndWaitResponse(sCmd) {
  return new Promise((resolve, reject) => {
    // 发送命令
    socket.write(sCmd);
    // 单次绑定data事件监听器
    const dataHandler = (chunk) => {
      OnReceive(chunk);
      // 移除监听器避免内存泄漏
      socket.off('data', dataHandler);
      resolve();
    };
    socket.on('data', dataHandler);
    
    // 可选:增加超时逻辑避免无限制等待
    // setTimeout(() => {
    //   socket.off('data', dataHandler);
    //   reject(new Error('socket请求超时'));
    // }, 5000);
  })
}

// 改造为async异步函数
async function login()  {
  const sCmd = "...";
  mCon = false;
  // 等待socket返回结果后再执行后续代码
  await sendCmdAndWaitResponse(sCmd);
  console.log("### mCon : " + mCon); // <-- Here
}

function SendCmdSocket(sCmd)  {
  const success = socket.write(sCmd);
}

// 全局data事件监听可根据自身业务需求决定保留或移除
socket.on('data', function(chunk) {
  OnReceive(chunk);
});

function OnReceive(chunk) {
  mCon = true;
}

login();

逻辑说明

封装后的sendCmdAndWaitResponse方法会在发送命令后等待socket的data事件触发,完成响应处理后才会将Promise状态置为完成,async函数中用await等待该Promise完成后,才会执行后续的console.log语句,此时mCon已经被赋值为true,输出符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:01