Javascript 等待节点中兔子的正确连接
我尝试为amqplib/callback\u api编写简单的eventemitter包装器。当rabbit不可用或断开连接时,我在处理情景方面有困难。 我有一个方法Javascript 等待节点中兔子的正确连接,javascript,node.js,rabbitmq,node-amqplib,Javascript,Node.js,Rabbitmq,Node Amqplib,我尝试为amqplib/callback\u api编写简单的eventemitter包装器。当rabbit不可用或断开连接时,我在处理情景方面有困难。 我有一个方法getConnect,它返回Promise,在建立连接时解析。但如果连接被拒绝,承诺显然会被拒绝。如何在连接未建立时强制此方法重新连接 /** * Async method getConnect for connection * @returns {Promise<*>} */ ge
getConnect
,它返回Promise,在建立连接时解析。但如果连接被拒绝,承诺显然会被拒绝。如何在连接未建立时强制此方法重新连接
/**
* Async method getConnect for connection
* @returns {Promise<*>}
*/
getConnect = async () => {
return new Promise((resolve, reject) => {
amqp.connect(this.config.url, async function(err, conn) {
if (err) {
reject(err);
}
resolve(conn);
})
})
};
/**
*用于连接的异步方法getConnect
*@returns{Promise}
*/
getConnect=async()=>{
返回新承诺((解决、拒绝)=>{
amqp.connect(this.config.url,异步函数(err,conn){
如果(错误){
拒绝(错误);
}
决议(康涅狄格州);
})
})
};
全部代码都在这里
也许,我已经很困了,但我完全糊涂了:)提前谢谢 如果您只想在建立连接之前保持tryng连接,可以将
getConnect
方法包装到新的keepConnect
方法中:
keepConnect = async () => {
while (true) {
try {
let conn = await getConnect()
return conn
} catch (e) {}
}
}
但我认为最好通过更改while
条件来实现类似“尝试连接n次”的功能。一般来说,“while true”解决方案不是干净的,可能执行不好,有减慢事件循环的风险(想象一下,如果connect方法总是在几毫秒内返回错误)
您还可以使用keepConnect
包装器作为idea,实现连接尝试之间的渐进延迟系统
如果您希望在连接丢失时重新连接,那么这与Rabbit(我不知道)和他的事件有关。将您的内容封装在
Promise
不是为处理“重试”逻辑而构建的。如果您想这样做,您应该使用。这将允许您在捕获错误时使用任意时间间隔重试
const{from,interval,of}=rxjs;
const{catchError,mergeMap,tap,skipWhile,take}=rxjs.operators;
常数阈值=3;
常数重试间隔=1000;
//相当于“amqp.connect”
常量函数ThatThrows=number=>
数量<阈值
? 承诺.拒绝(新错误(“错误”))
:承诺。解决(“确定”);
//相当于“getConnect”`
const getConnect=()=>
间隔(重试间隔)
.烟斗(
mergeMap(x=>from(functionthattrows(x)).pipe(catchError(e=>of(e))),
滑雪时(x=>{
常量isError=x个错误实例;
if(isError)console.log('founderror.Retrying…');
返回isError;
}),
采取(1)
).toPromise();
//只有当内心的承诺得到解决时,才能解决
getConnect().then(console.log)代码>
非常感谢!事实上,我需要修改我的代码以适应这种新的逻辑,但无论如何,现在它看起来很棒!谢谢你的回答