Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待节点中兔子的正确连接_Javascript_Node.js_Rabbitmq_Node Amqplib - Fatal编程技术网

Javascript 等待节点中兔子的正确连接

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

我尝试为amqplib/callback\u api编写简单的eventemitter包装器。当rabbit不可用或断开连接时,我在处理情景方面有困难。 我有一个方法
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)

非常感谢!事实上,我需要修改我的代码以适应这种新的逻辑,但无论如何,现在它看起来很棒!谢谢你的回答