在使用0MQ进行经纪商与客户之间的沟通中做出承诺

我正在试图发展一个代理人,作为使用0MQ的一些工人和客户之间的沟通的代理。 没有承诺的任务相对比较简单,但是由于我对承诺的使用没有经验,所以我无法理解如何在这个例子中实现承诺。

经纪人代码:

//Broker that serves as proxy for workers and clients var zmq = require('zmq'); var frontend = zmq.socket('router'); var backend = zmq.socket('router'); var Q = require('q'); frontend.bindSync('tcp://*:8001'); backend.bindSync('tcp://*:8002'); var frontendOn = Q.nbind(frontend.on, frontend); var backendOn = Q.nbind(backend.on, backend); var requestFrontend = frontendOn('message').then(function(){ console.log("Message received"); }); var requestBackend = backendOn('message').then(responseBackend); ... 

客户代码:

 //Client program that communicates with broker var zmq = require('zmq') var requester = zmq.socket('req'); var Q = require('q'); var arguments = process.argv.splice(2); //Connect with broker requester.connect(arguments[0]); console.log("Connected successfully to broker"); //Send message to broker requester.send(arguments[1]); console.log("Message sent to broker"); ... 

客户端连接到代理,发送消息,但消息不由代理处理。 任何想法,我做错了什么? 任何帮助,将不胜感激。

我没有与ZeroMQ合作,但从文档我假设似乎是一个事件订阅机制,而不是一个NodeJS风格的asynchronous操作接受callback。 它可能会不止一次地发射,对吧?

如果是这样的话,你为什么要使用承诺呢? 对于这种特殊情况,它们看起来是错误的抽象。

Promise表示一次完成或失败的操作,而不是asynchronous的值stream。

即使

 var requestFrontend = frontendOn('message').then(function(){ console.log("Message received"); }); 

工作,这对你没有任何好处,因为那样只会被调用一次。
我想这不是你想要的。

如果你正在寻找一种过滤,映射,合并或者压缩asynchronous序列的方法,你可以看看RxJS的确如此(它也与promise接口)。 但是承诺不应该,也不能用来替代那些不止一次的事件。


另一方面, 如果消息真的只有一次 ,我同意最好用promise来把它抽象出来。 但是, nfbindnbind在这里不起作用,因为它们需要function(err, result)风格的callbackfunction(result) ,并且有function(result)

这是我build议你使用的:

 function promiseOneMessage(queue) { var deferred = Q.defer(); queue.on('message', deferred.resolve); queue.on('error', deferred.reject); return deferred.promise; } var requestFrontend = promiseOneMessage(frontend) .then(function (message) { console.log("Message received", message); }) .done(); var requestBackend = promiseOneMessage(backend) .then(responseBackend) .done();