84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
产品规模越来越大,前端交互越来越复杂,会导致请求越来越多。请使用javascript或者其方言, 完成一个 XHR proxy,用于代理异步请求:
保持请求发起时间点,分布均匀,杜绝同一时间点多个请求一起发送
可以限制请求频率,如最多 一秒5个请求
可以限制最大连接数,如同时在线请求最多为 10个
保证请求与回调按照顺序执行,如,一秒内做了请求 A,B,C,D,E,那么其callback执行也需按照A,B,C,D,E的顺序执行,以保证依赖
兼容移动端
欢迎选择我的课程,让我们一起见证您的进步~~
一些思路:
可以采用循环定时器和令牌池依序处理请求,从而实现 分布均匀、请求频率限制和最大连接数等限制维护一个请求队列,队列是先进先出
定时器定时轮训令牌池,如果还存在令牌,则取出1个令牌,把执行请求队列中第一个,以致令牌池为空,则开始空循环,其中的请求频率是定时器间隔的倒数,令牌池的大小可以参考最大连接数。
对于回调依序执行,其实也是处理一个回调执行池,和维护一个头指针,并且在前面请求的时候传入调用id,比如从0开始的计数,所有的回调都不直接执行,而是压入回调执行池中,并触发一次遍历比较(因为池的大小受前面令牌池限制,所以遍历成本不高),然后比较头指针,如果回调id和头以致则执行,然后头指针自增,再遍历比较,直到没有需要执行的为止,这时就等待新的回调压入池。
这样的处理不区分pc和移动端的,可以纯javascript实现。
前提不成立,同一时间点有且最多只能有一个请求发送,JS执行是单线程。
可以限制请求频率,如最多一秒5个请求。可以限制最大连接数,如同时在线请求最多为 10个保证请求与回调按照顺序执行,如,一秒内做了请求 A,B,C,D,E,那么其callback执行也需按 照A,B,C,D,E的顺序执行,以保证依赖
说下思路:首先设置一个events数组,以及一个变量maxLinkNum最大连接数。events数组中的每个元素存储一个与请求相关的信息(主要是请求唯一标识,回调函数,当前状态:1.初始状态(默认值)。2.请求已完成。3.等待状态。)。数组的长度与maxLinkNum比较即可限制最大连接数。然后先记录一次时间,按照请求被加入的顺序,依次调用AJAX,调用AJAX完毕后再记录一次时间。判断时间差即可限制请求频率。在每个AJAX的回调中先将自身状态置为2。然后通过唯一标识找到events中位于当前请求之前的那些请求,判断他们的状态,如果为1,continue。如果为2,则将自身状态置为3。然后再循环一次数组开始到当前请求,依次调用状态为3的回调并在events清除。即可保证请求与回调按照顺序执行。
最后,社区存在的目的是互相学习,共同进步。而不是成为某些人逃避思考的温床。
一些思路:
可以采用循环定时器和令牌池依序处理请求,从而实现 分布均匀、请求频率限制和最大连接数等限制
维护一个请求队列,队列是先进先出
定时器定时轮训令牌池,如果还存在令牌,则取出1个令牌,把执行请求队列中第一个,以致令牌池为空,则开始空循环,其中的请求频率是定时器间隔的倒数,令牌池的大小可以参考最大连接数。
对于回调依序执行,其实也是处理一个回调执行池,和维护一个头指针,并且在前面请求的时候传入调用id,比如从0开始的计数,所有的回调都不直接执行,而是压入回调执行池中,并触发一次遍历比较(因为池的大小受前面令牌池限制,所以遍历成本不高),然后比较头指针,如果回调id和头以致则执行,然后头指针自增,再遍历比较,直到没有需要执行的为止,这时就等待新的回调压入池。
这样的处理不区分pc和移动端的,可以纯javascript实现。
前提不成立,同一时间点有且最多只能有一个请求发送,JS执行是单线程。
说下思路:首先设置一个events数组,以及一个变量maxLinkNum最大连接数。events数组中的每个元素存储一个与请求相关的信息(主要是请求唯一标识,回调函数,当前状态:1.初始状态(默认值)。2.请求已完成。3.等待状态。)。数组的长度与maxLinkNum比较即可限制最大连接数。然后先记录一次时间,按照请求被加入的顺序,依次调用AJAX,调用AJAX完毕后再记录一次时间。判断时间差即可限制请求频率。在每个AJAX的回调中先将自身状态置为2。然后通过唯一标识找到events中位于当前请求之前的那些请求,判断他们的状态,如果为1,continue。如果为2,则将自身状态置为3。然后再循环一次数组开始到当前请求,依次调用状态为3的回调并在events清除。即可保证请求与回调按照顺序执行。
最后,社区存在的目的是互相学习,共同进步。而不是成为某些人逃避思考的温床。