JS面试之异步模拟超时重传机制详解

 更新时间:2022年10月08日 14:55:12   作者:前端兰博  
这篇文章主要为大家介绍了JS面试之异步模拟超时重传机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

前面我讲解了两篇有关异步的逻辑思维题目,一个是红绿灯转换,还有一个是异步并发限制。有小伙伴私信我说不过瘾,希望还能再出一篇异步超时重传的讲解。为了满足这位粉丝的小小要求(我尼玛),我查询了相关资料和面试题,确实发现这是某大肠面试的代码设计题。不得不说这位粉丝发现的这个题目是相当亮眼,相当给力。

题目分析

超时重传机制,看到这个词语想必科班同学都十分十分熟悉吧。大家第一时间肯定会想到计算机网络中tcp的超时重传。不错,此处的异步模拟超时重传机制和计算机网络的超时重传原理是几乎一样的。二者的唯一区别就在于一个作用在tcp的可靠传输上,而本节我们的超时重传是作用在前端请求数据接口上。

性感例子

正直18岁的单身狗小明,血气方刚。他有一个小爱好喜欢在a网站上学习“外语”,既然是外语,那这个a网站的服务器应该在外国吧,网站a为了传播外语文化,在数据接口上采用了超时重传机制。假设最大请求次数是5次,每次最大请求延迟时间是5s。小明某天夜里又开始学起了外语,但是网速不好啊。

  • 他第一次打开a网站,延时6s,失败次数1
  • 他不忍心放弃学习,继续等待,网站继续请求数据,延时又6s,失败次数2
  • 他决定在等等,幸运的是此处接口3s后返回外语资料,他开心死了。

上面是一个超时重传的例子,如果数据请求次数在5次包含5的次数内请求成功,则请求成功。否则一直请求,当请求次数大于5时,返回失败。

代码设计

//timer--一次请求的最大响应时间
//limit--最大超时请求次数
//fn-----资源加载函数
function load (times,limit,fn) {
  return new Promise((resolve,reject)=>{
    let num = 0//重传的次数
    let statue = false//请求的状态
    let timer = null//定时器
    //一次请求的统计
    function request() {
      let timers1 = Date.now()
      fn().then(res=>{
        let timers2 = Date.now()
        if(timers2-timers1<times){
          statue = true
          resolve(res)
        }
      })
    }
    //一开始就异步加载数据
    request()
    //定时器轮询模拟超时重传
    timer = setInterval(()=>{
      //请求成功了
      if(statue) {
        clearInterval(timer)
        return 
      }
      //请求次数超过限制,错误
      if(num>=limit) {
        clearInterval(timer)
        reject("请求次数过多")
        return 
      }
      //继续请求
      console.log("重新请求中...")
      request()
      num++
    },times)
  })
}
//模拟资源请求
function fn() {
  return new Promise((resolve,reject)=>{
    setTimeout(() => {
      resolve("ok")
    }, 3000);
  })
}
//主函数调用
load(2000,5,fn)
  .then(msg=>{console.log(msg)})
  .catch(err=>{
    console.log(err)
  })

效果展示

核心讲解

首先我们对问题进行拆解

  • 定义一个request,判断一次接口请求,根据开始和结束时间戳判断是否超时
  • 定义statue表示当前是否请求成功,定义count统计当前已经超时重传的次数
  • 开启全局定时器轮询的监听一次请求,定时器的回调就是判断当前请求是否成功,如果成功直接返回数据并关闭全局定时器,如果最大请求次数超过了限制,直接返回错误。否则继续轮询请求接口。

以上就是JS面试之异步模拟超时重传机制详解的详细内容,更多关于JS面试异步模拟超时重传的资料请关注脚本之家其它相关文章!

相关文章

  • JS继承与工厂构造及原型设计模式详解

    JS继承与工厂构造及原型设计模式详解

    这篇文章主要为大家介绍了JS继承与工厂构造及原型设计模式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • JavaScript的八种数据类型

    JavaScript的八种数据类型

    这篇文章主要分享的是JavaScript的八种数据类型,ES5的时候,我们大家认知的数据类型是 6种的,但是ES6 中新增了一种 Symbol,谷歌67版本中还出现了一种 bigInt,是指安全存储、操作大整数,像下面文章我可没就来看看这八种数据类型的详细介绍吧
    2022-01-01
  • 图片按比例缩放函数

    图片按比例缩放函数

    图片按比例缩放函数...
    2006-06-06
  • 基于JavaScript ES新特性let与const关键字

    基于JavaScript ES新特性let与const关键字

    这篇文章主要介绍了基于JavaScript ES新特性let与const关键字,let是ECMAScript 2015新增的一个关键字,用于声明变量,const关键字用于声明一个常量,更多详细内容,请需要的小伙伴参考下面文章的介绍,希望对你有所帮助
    2021-12-12
  • 微信小程序 地图map实例详解

    微信小程序 地图map实例详解

    这篇文章主要介绍了微信小程序 地图map实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • 浅谈JavaScript作用域

    浅谈JavaScript作用域

    这篇文章主要介绍了JavaScript作用域详情,作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突,下面文章我们一起来了解更多的详细内容,需要的小伙伴也可以参考一下
    2021-12-12
  • 微信小程序的生命周期的详解

    微信小程序的生命周期的详解

    这篇文章主要介绍了微信小程序的生命周期的详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • JS中this的4种绑定规则详解

    JS中this的4种绑定规则详解

    如果你学过面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章,this既不指向函数自身,也不指函数的词法作用域,具体怎么使用JS中的this,JS中的this绑定规则又是什么?
    2020-02-02
  • js 数组 fill() 填充方法

    js 数组 fill() 填充方法

    这篇文章主要介绍了js 数组 fill() 的填充方法,初始化数组的方法,但是初始化数组之后,数组中的每一项元素默认为 empty 空位占位,如何对数组这些空位添加默认的元素,ES6提供了 fill() 方法实现这一操作。本文总结数组 fill() 方法的详细使用,需要的朋友可以参考一下
    2021-10-10
  • 微信小程序 实现列表项滑动显示删除按钮的功能

    微信小程序 实现列表项滑动显示删除按钮的功能

    这篇文章主要介绍了微信小程序列表项滑动显示删除按钮的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论