【问题标题】:general solution to retry a promise in javascript在javascript中重试promise的通用解决方案
【发布时间】:2017-06-01 18:33:46
【问题描述】:

我试图给出一个重试承诺的通用解决方案。以下是我的方式,并出现“未捕获(承诺)”的错误。

我该如何解决这个问题?

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)
})

【问题讨论】:

  • 是什么让你认为它会第二次起作用?

标签: javascript es6-promise


【解决方案1】:

您询问的原因是您在catch 中错过了对resolve 的呼叫:

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

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


但是tryAtMost 有一个问题:它无法使用您提供的信息,因为它不知道该尝试什么。您需要将其传递给 executor,而不是 promise,因为您需要重试的是 executor 的工作。这也让函数变得更加简单:

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多