我正在构建一个报告服务,其中一个进程提交查询,检索令牌,然后将令牌交给另一个进程,我们从该进程查询报告服务并将结果流回。
鉴于此代码,我应该如何实现阻塞调用,直到暂停为假?
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
因为一切都是异步的,所以步骤3可能会在Web浏览器连接之前开始返回数据,这意味着数据丢失。我可以缓冲内存中的数据,直到客户端回来,但我宁愿阻止数据行的发射,因为这会阻止RAM的使用。或者也许我只是在开玩笑,RAM仍然会在底层库中使用?无论如何,指针赞赏!
答案 0 :(得分:2)
如果您要在事件循环中阻塞,我认为您必须等待实现web-workers api(线程,类型)。
我认为保存来自pg的行是一个更好的主意。