如何在node.js中为自定义EventEmitter正确实现暂停/恢复

时间:2011-03-12 17:09:21

标签: node.js eventemitter

我正在构建一个报告服务,其中一个进程提交查询,检索令牌,然后将令牌交给另一个进程,我们从该进程查询报告服务并将结果流回。

鉴于此代码,我应该如何实现阻塞调用,直到暂停为假?

var   util = require('util')
    , events = require('events')
    , pg = require('pg')

// QueryHandler is an EventEmitter
function QueryHandler(sql) {
  this.paused = true

  pg.connect(connectionString, function(err, client) {
    // error handling ignored for sake of illustration
    var query = client.query(sql)

    query.on('row', function(row) {
      if (this.paused) {
        // Somehow block until paused === false
      }

      this.emit(row)
    }.bind(this))
  }.bind(this))
}

util.inherits(QueryHandler, events.EventEmitter)

QueryHandler.prototype.resume = function() {
  this.paused = false
}

这是一个交互图,解释了我想要实现的目标:

http://teksol.info.s3.amazonaws.com/reporting-service.png

  1. 网络浏览器向前端网络服务器询问报告
  2. 前端网络服务器向报告服务询问与特定查询相关的令牌
  3. 同时,报告服务连接到PostgreSQL并发送查询
  4. 前端网络服务器将报告服务的URL和令牌返回给Web浏览器
  5. Web浏览器使用返回的令牌
  6. 对报告服务执行Ajax(长轮询)请求
  7. 报告服务在回到Web浏览器时对行进行流式传输
  8. 因为一切都是异步的,所以步骤3可能会在Web浏览器连接之前开始返回数据,这意味着数据丢失。我可以缓冲内存中的数据,直到客户端回来,但我宁愿阻止数据行的发射,因为这会阻止RAM的使用。或者也许我只是在开玩笑,RAM仍然会在底层库中使用?无论如何,指针赞赏!

1 个答案:

答案 0 :(得分:2)

如果您要在事件循环中阻塞,我认为您必须等待实现web-workers api(线程,类型)。

我认为保存来自pg的行是一个更好的主意。