gpt4 book ai didi

javascript - 在 JavaScript 中重试 Promise 的通用解决方案

转载 作者:行者123 更新时间:2023-11-30 11:38:23 25 4
gpt4 key购买 nike

我尝试给出一个重试 promise 的通用解决方案。下面是我的方法,出现了“未捕获( promise )”的错误。

如何解决这个问题?

function tryAtMost(maxRetries, promise) {
let tries = maxRetries

return new Promise(function(resolve, reject) {
promise.then((result) => {
resolve(result)
})
.catch(err => {
if (tries > 0) {
console.log(`tries with ${tries}`)
tryAtMost(--tries, promise);
} else {
reject(err)
}
})
})
}

tryAtMost(3, promise).then(result => {
console.log(result)
})
.catch(err => {
console.log(err)
})

最佳答案

您提出问题的原因是您在 catch 中缺少对 resolve 的调用:

.catch(err => {
if (tries > 0) {
console.log(`tries with ${tries}`);
resolve(tryAtMost(--tries, promise)); // <=== ****
}
else {
reject(err)
}
})

...所以你正在创建一个永远不会被任何东西处理的 promise ,所以如果它拒绝,你将得到一个未处理的拒绝。


但是tryAtMost 有一个问题:它无法处理您提供的信息,因为它不知道要尝试什么。您需要将其传递给执行者,而不是 promise ,因为您需要重试的是执行者的工作。这也使得功能变得更加简单:

function tryAtMost(tries, executor) {
--tries;
return new Promise(executor)
.catch(err => tries > 0 ? tryAtMost(tries, executor) : Promise.reject(err));
}

用途:

tryAtMost(4, (resolve, reject) => {
// The thing to (re)try
});

示例:

function tryAtMost(tries, executor) {
console.log(`trying, tries = ${tries}`);
--tries;
return new Promise(executor)
.catch(err => tries > 0 ? tryAtMost(tries, executor) : Promise.reject(err));
}

tryAtMost(4, (resolve, reject) => {
const val = Math.random();
if (val < 0.3) {
resolve(val);
} else {
reject(val);
}
})
.then(result => console.log(result))
.catch(err => console.error(err));

关于javascript - 在 JavaScript 中重试 Promise 的通用解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43568352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com