发布时间:2022-11-20 文章分类:WEB开发 投稿人:樱花 字号: 默认 | | 超大 打印

引言

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

题目分析

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

性感例子

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

上面是一个超时重传的例子,如果数据请求次数在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)
})

效果展示

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

核心讲解

首先我们对问题进行拆解

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