【问题标题】:Custom Retry Function自定义重试功能
【发布时间】:2021-01-11 03:18:56
【问题描述】:

尝试创建一个函数retry,该函数返回一个函数,该函数调用并返回从回调函数传递其参数并捕获错误的值。如果捕获到错误,它应该返回带有 catch 的回调函数。如果错误数超过计数,则抛出错误。

这是目前为止所做的:

const retry = (count, callback) => {
    let attempts = 1;
    const _retry = async (...args) => callback(...args)
        .catch(err => {
            if (attempts > count) throw err
            attempts++
            return _retry(...args)
        });
    return _retry
}

调用时出现problem

var r = Math.random().toString(36).slice(2)
var arg = (n) => async (...v) =>
    --n < 0 ? v : Promise.reject(Error(`>>> x:${v}`))
    
await retry(3, arg(2))(r)

【问题讨论】:

  • 我认为您在将函数作为参数传递时调用了该函数-> arg(2)
  • _retry 是什么。它似乎没有被声明...
  • 不是真的,还有一个 arg:async (...v)
  • @AluanHaddad 可能是 const _retry 和 return _retry
  • 是的,但如果不是,那么您将在异步上下文中更改隐式全局变量,那将是一场灾难。您必须声明它或使其成为命名函数表达式而不是箭头函数,这样也可以。

标签: javascript typescript asynchronous


【解决方案1】:

在我看来,由于 async 关键字,重试现在返回了一个 Promise。尝试从重试定义中删除 async 关键字并使 _retry 函数异步:

const retry = (count, callback) => {
    let attempts = 1;
    return _retry = async (...args) => callback(...args)
        .catch(err => {
            if (attempts > count) throw err
            attempts++
            return _retry(...args)
        });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2018-02-10
    相关资源
    最近更新 更多