gpt4 book ai didi

javascript - 使用 0MQ 的代理-客户通信中的 promise

转载 作者:搜寻专家 更新时间:2023-11-01 00:45:11 25 4
gpt4 key购买 nike

我正在尝试开发一个代理,作为一些使用 0MQ 的工作人员和客户之间通信的代理。如果没有 promises,这项任务相对简单,但由于我对 promises 的使用没有经验,我无法理解如何在这个例子中实现 promises。

经纪人代码:

//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 但 from the docs我假设 on 似乎是一种事件订阅机制,而不是 NodeJS 风格的异步操作接受回调。它可能会触发不止一次,对吧?

如果是这种情况,您为什么要使用 promises?对于这种特定情况,它们似乎是错误的抽象。

Promise 表示完成或失败一次的操作,而不是异步值流。

即使

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

有效,它不会对您有任何好处,因为 then 只会被调用一次。
我想这不是您想要的。

如果您正在寻找过滤、映射、合并或限制异步序列的方法,您可以查看 RxJS正是这样做的(它也与 promise 接口(interface))。但是 promises 不应该,也不能用作多次触发事件的替代品。


另一方面,如果消息确实只出现一次,我同意最好使用 promises 将其抽象化。但是, nfbindnbind 在这里不起作用 因为它们需要 function(err, result) 风格的回调,而你有 function(result).

以下是我建议您改用的内容:

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();

关于javascript - 使用 0MQ 的代理-客户通信中的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20927393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com