这是我的原始代码,基本上它试图接受“交换报价”,如果它失败了,它就会被拒绝。我如何让它在两秒钟的间隔内对相同的“交换报价”重试这个语句10次,如果之后仍然失败,则拒绝报价?
try {
offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) {
if (err) {
helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err);
offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
});
return;
}发布于 2016-11-28 03:58:37
回调上带有setTimeout()的内容。promise甚至是ES2017 async-await (babel,TypeScript)可以帮助你获得更干净的代码。此外,因为错误是在回调中传播的,所以不需要使用try块,除非您正在使用的应用程序接口可能会立即失败,但通常不是以回调传递的方式。
function putOffer(maxRetries) {
offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) {
if (err) {
if (maxRetries > 0) {
setTimeout(function () { putOffer(maxRetries - 1); }, 2000);
return;
}
helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err);
...
return;
}
});
}
putOffer(10);发布于 2018-06-20 02:50:55
我想稍微扩展一下@AndréWerlang的答案。我的问题是,我不得不进行成百上千的调用(由于应用程序接口的限制),并且在所有承诺完成后,我还利用Promise.all()返回所有数据。这可能不是Promise.all()的理想用法,甚至不是正确的用法-但在错误处理方面,它的工作方式符合我的预期:
const requestPromise = (req) => {
return new Promise((resolve, reject) => {
const maxRetries = 5;
function tryRequest(retries) {
// try a request (http)
if (someErr) {
setTimeOut(()=>{ tryRequest(maxRetries--); }, 2000);
return;
}
else {
// resolve your Promise
resolve(data);
}
}
});
}https://stackoverflow.com/questions/40833148
复制相似问题