最简单的Node.js请求序列化方法
Simplest approach to Node.js request serialisation
我遇到了一个经典的异步/并发问题,这是人们在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(...)
- Ajax发布表单序列化,发布引号'
- 序列化数据属性中对象的最可靠方法
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 为什么JSON.stringify没有序列化原型值
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 使用JSON序列化图论树的解决方法
- 序列化具有方法的自定义对象.序列化后删除的方法-要采取的步骤
- 将元素添加到序列化列表而不重复的更好方法
- Javascript:反序列化对象和混合方法
- JavaScript序列化和方法
- 在c#中反序列化贝宝响应的正确方法
- 要实现的jquery序列化方法
- 最简单的Node.js请求序列化方法
- 在反序列化JSON对象时,是否有方法将属性名称转换为小写?
- 有没有更有效的方法来用angularjs序列化表单?
- 使用序列化方法上传图像
- 在 JavaScript 中序列化/反序列化对象的最佳方法
- 通过在 Codeigniter 中使用 jQuery Load 方法发布序列化数据
- 反序列化 JSON C# 的最快方法
- 是否有一种方法来json序列化字段,不是存储在asp.net中的表单