javascript - Node.js 请求序列化的最简单方法

标签 javascript node.js concurrency

我遇到了一个典型的异步/并发问题,人们在 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/

相关文章:

javascript - 如何解析json对象来更新HANA表?

javascript - 将数据从 ProMotion WebScreen 传递到 Javascript

node.js - 位于 Promise 链中间的 EventEmitter

javascript - 在浏览器中使用 Node 模块

node.js - 在 NodeJS 中观察流式 HTTP 响应进度,express

javascript - 使用 redux-saga 进行异步 api 调用

javascript - highcharts悬停效果问题

java - 多线程环境中的 boolean 值

java - 在文件读取发生之前更改标签文本

java - android 中的多线程 : message passing