【问题标题】:How to properly implement pause/resume in node.js for custom EventEmitter如何在 node.js 中为自定义 EventEmitter 正确实现暂停/恢复
【发布时间】:2011-03-12 17:09:21
【问题描述】:

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

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

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
}

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

  1. 网络浏览器向前端网络服务器请求报告
  2. 前端网络服务器向报告服务请求与特定查询相关的令牌
  3. 同时,报告服务连接到 PostgreSQL 并发送查询
  4. 前端网络服务器将报告服务的 URL 和令牌返回给网络浏览器
  5. Web 浏览器使用返回的令牌向报告服务发出 Ajax(长轮询)请求
  6. 报告服务在行返回 Web 浏览器时对其进行流式传输

因为一切都是异步的,第 3 步可能会在网络浏览器连接之前开始返回数据,这意味着数据丢失。我可以缓冲内存中的数据,直到客户端返回,但我宁愿阻止数据行的发射,因为这会阻止 RAM 的使用。或者也许我只是在开玩笑,RAM 仍然会在底层库中使用?无论如何,指针表示赞赏!

【问题讨论】:

  • 你用什么软件绘制图表?

标签: node.js eventemitter


【解决方案1】:

如果您要阻止事件循环,我认为您必须等待实现 web-workers api(线程,排序)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多