0

我正在创建一个重新连接到 RabbitMQ(使用 amqplib)的方法,使用递归并返回一个传递连接对象的 Promise。这是我到目前为止所拥有的:

function connectServiceBus() {
     return new Promise(function (resolve, reject) {
       amqp.connect(process.env.RMQ_CONN + "?heartbeat=60", function(err, conn) {
         if (err) {
           console.error("[AMQP]", err.message);
           //restarts in 1 sec
           return setTimeout(connectServiceBus, 1000);
         }
         conn.on("error", function(err) {
           if (err.message !== "Connection closing") {
             console.error("[AMQP] conn error", err.message);
             reject(Error("[AMQP] conn error"));
           }
         });
         conn.on("close", function() {
           console.error("[AMQP] reconnecting");
           //restarts in 1 sec
           return setTimeout(connectServiceBus, 1000);
         });

         console.log("[AMQP] ServiceBus Connected");
         resolve(conn);
      });
   });
}

我这样称呼这个方法:

sbus.connectServiceBus().then( function(conn) {
    console.log("Promise called, connection Object Returned: " + conn);
}).catch (err => {
    console.error("Callback ERROR: " + err);
});

问题是,如果我运行它并且 RabbitMQ 正在运行,它就可以工作。如果 RabbitMQ 关闭,代码会重新连接 OK,但永远不会调用 Promise。

如果 RabbitMQ 已关闭,则 if (err) == TRUE 并调用 setTimeout(connectServiceBus, 1000)。由于递归调用,Promise 永远不会被解决,但不知道如何修复它。

我试过更换

return setTimeout(connectServiceBus, 1000);

return resolve(connectServiceBus);

但这也不起作用。

谁能解释我如何解决这个问题,或提供任何见解?

4

1 回答 1

0

我找到了一个可行的解决方案。我替换

return setTimeout(connectServiceBus, 1000);

setTimeout( () => resolve( connectServiceBus() ), 1000 );
return;

编辑:考虑到上面 Bergi 的评论,我已经更新了我的代码并删除了多余的行。我添加的 return 只是阻止代码退出“if 语句”并执行最终解析。通过添加“else”,不再需要。

function connectServiceBus() {
     return new Promise(function (resolve, reject) {
       amqp.connect(process.env.RMQ_CONN + "?heartbeat=60", function(err, conn) {
         if (err) {
           console.error("[AMQP]", err.message);
           //restarts in 1 sec
           setTimeout( () => resolve( connectServiceBus() ), 1000 );
         } else {
           console.log("[AMQP] ServiceBus Connected");
           //keep a reference locally so we can close this connection gracefully on err
           amqpConn = conn;
           resolve(amqpConn);
         }
      });
   });
}
于 2019-07-28T16:49:56.237 回答