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

