CoffeeScript如何实现等待回调设置标志后执行后续代码
解决方案
核心逻辑
Node.js 进程存在活跃的网络监听服务时不会自动退出,你不需要额外编写阻塞循环或固定延迟逻辑,只需要创建一个状态受控的Promise,在收到客户端的结束指令时手动触发Promise完成,再执行后续清理和退出操作即可。
修改后的完整代码
# 业务函数 process_data = (data) -> double_value: data * 2 triple_value: data * 3 clean_up_actions = () -> console.log "Cleaning up..." # 初始化服务参数 net = require('net') domain = '10.1.1.28' port = 9001 console.log("Creating server...") # 定义等待退出的受控Promise waitForExit = new Promise (resolve) -> server = net.createServer (socket) -> console.log "#{socket.remoteAddress} has connected" # 处理收到的数据 socket.on 'data', (data) -> console.log("Data received...") incoming_data = JSON.parse(data) some_useful_value = incoming_data["some_useful_value"] result = process_data(some_useful_value) socket.write JSON.stringify(result) # 收到结束指令时触发清理和退出 if incoming_data["end_program"] clean_up_actions() # 先关闭服务避免新连接,关闭完成后resolve Promise server.close -> resolve() console.log "Listening to #{domain}:#{port}" server.listen port, domain console.log("Waiting until complete...") # 等待结束信号触发后退出 waitForExit.then -> console.log "--- PROGRAM FINISHED ---" process.exit(0)
关键改动说明
- 移除了原来的全局状态标志位和阻塞死循环,用Promise状态替代轮询判断,完全不阻塞Node事件循环
- 结束逻辑直接绑定到
end_program参数的接收事件,收到指令后先执行清理、关闭服务,再触发Promise完成 - 进程会持续运行直到收到结束指令,不会受固定时长限制,也不会影响正常的网络请求处理
如果需要继续使用Q库实现,替换Promise部分即可:
Q = require('q') exitDefer = Q.defer() # 收到结束指令时调用 exitDefer.resolve() exitDefer.promise.finally -> console.log "--- PROGRAM FINISHED ---" process.exit(0)
内容的提问来源于stack exchange,提问作者xulo
相关产品推荐
相关产品推荐

