求这道笔试题的思路和写法?

产品规模越来越大,前端交互越来越复杂,会导致请求越来越多。请使用javascript或者其方言, 完成一个 XHR proxy,用于代理异步请求:



  • 保持请求发起时间点,分布均匀,杜绝同一时间点多个请求一起发送


  • 可以限制请求频率,如最多 一秒5个请求


  • 可以限制最大连接数,如同时在线请求最多为 10个


  • 保证请求与回调按照顺序执行,如,一秒内做了请求 A,B,C,D,E,那么其callback执行也需按 照A,B,C,D,E的顺序执行,以保证依赖


  • 兼容移动端


已邀请:

一些思路:


  1. 可以采用循环定时器和令牌池依序处理请求,从而实现 分布均匀、请求频率限制和最大连接数等限制
    维护一个请求队列,队列是先进先出


定时器定时轮训令牌池,如果还存在令牌,则取出1个令牌,把执行请求队列中第一个,以致令牌池为空,则开始空循环,其中的请求频率是定时器间隔的倒数,令牌池的大小可以参考最大连接数。



  1. 对于回调依序执行,其实也是处理一个回调执行池,和维护一个头指针,并且在前面请求的时候传入调用id,比如从0开始的计数,所有的回调都不直接执行,而是压入回调执行池中,并触发一次遍历比较(因为池的大小受前面令牌池限制,所以遍历成本不高),然后比较头指针,如果回调id和头以致则执行,然后头指针自增,再遍历比较,直到没有需要执行的为止,这时就等待新的回调压入池。


  2. 这样的处理不区分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清除。即可保证请求与回调按照顺序执行。


最后,社区存在的目的是互相学习,共同进步。而不是成为某些人逃避思考的温床。

要回复讨论请先登录注册