将承诺包装在承诺中是一种反模式
Is wrapping a promise in a promise an anti-pattern?
我试图使用Promise API编写用于在超时时重新连接到数据库的代码。
我最终所做的是将连接到DB的承诺包装在一个承诺中,但我不确定这是否是最好的做法。我想可能有一种方法可以通过尝试连接到数据库来使用最初的承诺,但我想不通。
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拒绝,此函数将接受一个返回promise和多次重试的函数,并重试该函数与retries
一样多次。
如果解决,重试链将停止。
在您的情况下:
let connectionPromise = withRetry(connect, 3); // connect with 3 retries if fails.
相关文章:
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- 这是一种常见的模式吗?(返回数据而不是返回承诺)
- 有没有一种 AngularJS 方法来使用带有承诺返回的浏览器模式
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用
- Node sequelize回调承诺期望一个函数,是否有一种方法可以通过函数调用删除已声明的函数
- 将承诺包装在承诺中是一种反模式
- 用q创造承诺的另一种方式
- 在延迟/承诺实现中使用计时器是一种罪恶
- 有没有一种优雅的方式将承诺联系在一起
- jquery配置错误:readyList.承诺不是一种功能
- 是否有一种直接的方法可以让jQuery动画在集合上创建一个新的承诺?
- 是否有一种方法可以在承诺完成时独立于结果执行一些代码
- 有没有一种更干净的方式来把这些蓝鸟的承诺联系起来
- 有没有一种方法可以在一个准确的时间实现一个承诺
- 有没有一种方法可以检查$.when(..)中承诺的个人结果,而不管最终状态如何