我试图编写代码,使用Promise API重新连接到数据库并超时.
最后我最终做的是承诺在承诺中连接数据库,但我不确定这是否是最好的做事方式.我认为可能有一种方法可以使用原始的承诺来尝试连接到数据库,但我无法弄明白.
function connect(resolve) { console.log('Connecting to db...'); MongoClient.connect(url, { promiseLibrary: Promise }) .then((db) => resolve(db)) .catch((err) => { console.log('db connection failed!:\n', err); if (retry++ < 3) { console.log('Trying again...'); setTimeout(() => connect(resolve), 5000); } else { console.log('Retry limit reached!'); } }); } module.exports = new Promise(connect);
我认为没有setTimeout
阻挡就有可能,但我无法解决它.
这是一个更通用的解决方案:
function withRetry(asyncAction, retries) { if (retries <= 0) { // Promise.resolve to convert sync throws into rejections. return Promise.resolve().then(asyncAction); } return Promise.resolve() .then(asyncAction) .catch(() => withRetry(asyncAction, retries - 1)); }
此函数将采用一个返回promise和重试次数的函数,并且retries
如果Promise拒绝,则重试该函数的次数.
如果它结算,重试链将停止.
在你的情况下:
let connectionPromise = withRetry(connect, 3); // connect with 3 retries if fails.