当前位置: 首页 > 知识库问答 >
问题:

用promise包装promise是一种反模式吗?

咸玄天
2023-03-14

我正在尝试使用Promise API编写重新连接到超时数据库的代码

我最后做的是把连接DB的promise包装成一个promise,但我不确定这是否是最好的方式。我想可能有一种方法可以使用最初的promise,从尝试连接到数据库,但我无法找到它。

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个答案

尉迟阳煦
2023-03-14

这里有一个更通用的解决方案(非阳性测试):

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和多次重试的函数,如果promise被拒绝,则重试该函数的次数与重试次数相同。

如果问题解决,重试链将停止。

就您而言:

let connectionPromise = withRetry(connect, 3); // connect with 3 retries if fails.
 类似资料:
  • Promise模式 我们已经隐含地看到了使用Promise链的顺序模式(这个-然后-这个-然后-那个的流程控制),但是我们还可以在Promise的基础上抽象出许多其他种类的异步模式。这些模式用于简化异步流程控制的的表达——它可以使我们的代码更易于推理并且更易于维护——即便是我们程序中最复杂的部分。 有两个这样的模式被直接编码在ES6原生的Promise实现中,所以我们免费的得到了它们,来作为我们其

  • 问题内容: 我在StackOverflow上看到了答案,有人建议为AngularJS服务提供回调函数。 在我看来,这是一种反模式。该服务返回promise,让方法执行回调函数感觉像是对控件的不良转换。 一个人如何 重因子 这样和代码如何解释为什么原始的方式是 不是一个好主意? 问题答案: 该代码可以按如下方式重构: 通过使服务返回承诺,并使用承诺的方法,可以实现相同的功能,并具有以下好处: Pro

  • 问题内容: 我正在使用该函数来控制一次最大操作数。 如您所见,我无法将该函数声明为异步的,因为我无权访问该函数的第二个回调中的值。 问题答案: 您实际上在promise构造函数执行程序函数内使用了promise,因此这是Promise构造函数anti-pattern。 您的代码很好地说明了主要风险:没有安全地传播所有错误。读为什么在那里。 此外,使用/ 会使相同的陷阱更加令人惊讶。相比: 天真(错

  • 编辑 继续重试直到promise解决的模式(具有延迟和最大重试次数) #1的代码。不断重试,直到promise解决为止(语言社区有任何改进吗?) 使用 #2的代码继续重试,直到以可重用的方式产生结果(条件是会发生变化的)。

  • 什么是Promise? 当开发者们决定要学习一种新技术或模式的时候,他们的第一步总是“给我看代码!”。摸着石头过河对我们来讲是十分自然的。 但事实上仅仅考察API丢失了一些抽象过程。Promise是这样一种工具:它能非常明显地看出使用者是否理解了它是为什么和关于什么,还是仅仅学习和使用API。 所以在我展示Promise的代码之前,我想在概念上完整地解释一下Promise到底是什么。我希望这能更好