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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:27:04