我遇到了一个典型的异步/并发问题,人们在 Node.js 中编写服务时有时会遇到这个问题。我有一个对象,它从 RDBM 获取一些数据以响应请求,并在行获取完成时发出 fin
事件(使用 EventEmitter
)。
正如您所料,当服务的调用者几乎同时对其进行多次调用时,行将以不可预测的顺序返回。对于与调用函数对生成它们的请求的理解不相符的行,将触发 fin
事件。
这是我正在做的事情(为了相关性进行了简化):
var mdl = require('model.js');
dispatchGet: function(req, res, sec, params) {
var guid = umc.genGUID(36);
mdl.init(this.modelMap[sec], guid);
// mdl.load() creates returns a 'new events.EventEmitter()'
mdl.load(...).once('fin',
function() {
res.write(...);
res.end();
});
}
一个简单的测试表明,mdl.guid
经常与guid
不对应。
我本以为在 mdl.load()
函数中创建一个 new events.EventEmitter()
可以通过创建一个离散的 EventEmitter 来解决这个问题
对于每个请求,但显然情况并非如此;我想它与任何其他对象都适用相同的对象持久性规则,无论 new
是什么。
我是一名 C 程序员,背景是:我当然可以想出自己的方案,使用某种循环队列或散列方案将这些回复与他们的请求相关联。不过,我猜这个问题已经被解决过很多次了。我的研究揭示了许多关于如何最好地处理这个问题的观点——各种排队实现、Futures
等。
我想知道的是,这里实现良好异步流量控制的最简单方法是什么?如果不需要的话,我不想陷入某种依赖的巨大范式转变中。对于哪个第三方模块最好,是否有一个相对简单、规范、明确的解决方案和/或广泛共识?
最佳答案
您的 model.js
是否看起来像这样?
module.exports = {
init : function(model, guid) {
this.guid = guid;
...
}
};
您必须意识到,您传递给 module.exports
的对象是一个共享对象,从某种意义上说,运行 require("model.js ")
它将接收对同一对象的引用。
因此,每次运行 mdl.init()
时,该对象的 guid
属性都会更改,这可以解释您的评论“”...一个简单的测试表明mdl.guid经常与guid不对应”。
这实际上取决于您的具体实现,但我认为您想使用一个类:
// model.js
var Mdl = function(model, guid) {
this.guid = guid;
};
Mdl.prototype.load = function() {
// instantiate and return a new EventEmitter.
};
module.exports = Mdl;
// app.js
var Mdl = require('model.js');
...
var mdl = new Mdl(this.modelMap[sec], guid);
mdl.load(...)
关于javascript - Node.js 请求序列化的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16812915/