美文网首页
封装一个函数,实现请求失败重传

封装一个函数,实现请求失败重传

作者: 杭州程序员小陈 | 来源:发表于2021-07-21 09:09 被阅读0次

一个异步请求/操作 模拟代码如下

const request = (url) => new Promise((resolve, reject) => {
  setTimeout(() => {
    Math.random() > 0.8 ? resolve(url+' ok') : reject(url + ' fail')
  }, 1000)
})

request('https://jirengu.com')
 .then(data => console.log(data))
 .catch(err => console.log(err))

要求:实现一个函数retry ,能对原函数进行封装,达到如下效果:如果如果请求失败,会自动重新发起请求,最多尝试n次。

const request = (url) => new Promise((resolve, reject) => {
  setTimeout(() => {
    Math.random() > 0.8 ? resolve(url+' ok') : reject(url + ' fail')
  }, 1000)
})

function retry() {
 ...
}

let request4 = retry(request, 4)
request4('https://jirengu.com')
  .then(data => console.log(data))  //只要成功1次,进入该逻辑
  .catch(err => console.log(err))   //连续失败4次,进入该逻辑

实现

const retry = (fn, n=3) => (...args) => {
  function run() {
    return fn(...args).then(data => {
      return Promise.resolve(data)
    }).catch(error => {
      n--
      if(n <= 0) {
        return Promise.reject(error)
      } else {
        return run()
      }
    }) 
  }

  return run()
}

完整测试代码

let i = 0
const request = (url) => new Promise((resolve, reject) => {
  console.log(`第${++i}次执行`)
  setTimeout(() => {
    Math.random() > 0.8 ? resolve(url + ' ok') : reject(url + ' fail')
  }, 1000)
})


const retry = (fn, n=3) => (...args) => {
  function run() {
    return fn(...args).then(data => {
      return Promise.resolve(data)
    }).catch(error => {
      n--
      if(n <= 0) {
        return Promise.reject(error)
      } else {
        return run()
      }
    }) 
  }

  return run()
}


let request4 = retry(request, 4)
request4('https://jirengu.com')
  .then(data => console.log(data))
  .catch(error => console.log(error))

相关文章

  • 封装一个函数,实现请求失败重传

    一个异步请求/操作 模拟代码如下 要求:实现一个函数retry ,能对原函数进行封装,达到如下效果:如果如果请求失...

  • 学习Parse iOS

    可靠上传 失败重传 上传失败 关闭App导致失败 方案(具体实现还要考虑多线程) Command 设计模式封装网络...

  • 封装一个自己的通用Ajax

    一个简单的Ajax请求 首先在封装一个自己的ajax函数之前,我们需要先知道怎么实现一个简单的ajax请求。 这里...

  • python函数的简单封装

    函数的简单封装 实现对文件读写操作的封装 file_function.py(实现函数的封装) (进行函数调用)

  • 实现一个 jQuery 的 API

    按照课程内容,补全下面的代码 实现步骤 封装一个函数 再封装一个函数 实现这两个函数 第一个函数addClass(...

  • 实现一个 jQuery 的 API

    按照课程内容,补全下面的代码 实现步骤 封装一个函数 再封装一个函数 实现这两个函数 第一个函数addClass(...

  • ajax前后端交互原理(7)

    7.ajax函数封装 #7.1.实例引入 需求: 每秒钟请求一次服务器 获取到数据 实现: 把ajax进行封装 #...

  • JS设计模式5 - 命令模式

    命令模式 目标 封装函数调用,请求,操作。解耦对象的调用和方法的实现。 何时使用 需要回调能力 请求需要执行很多次...

  • JavaScript 【01】初探jQuery

    函数库—— 特定种类的API. 1、封装函数 —— 写一个函数,重复封装函数,实现一个DOM API 没有提供的功...

  • Httpclient4的http请求封装

    1. 实现 httpheader 2. 实现 http 请求封装

网友评论

      本文标题:封装一个函数,实现请求失败重传

      本文链接:https://www.haomeiwen.com/subject/ssodmltx.html