当前位置:  开发笔记 > 编程语言 > 正文

在承诺中包含一个反模式的承诺吗?

如何解决《在承诺中包含一个反模式的承诺吗?》经验,为你挑选了1个好方法。

我试图编写代码,使用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阻挡就有可能,但我无法解决它.



1> Madara Uchih..:

这是一个更通用的解决方案:

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.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有