小程序关于request请求的限制

  1. 默认超时时间和最大超时时间都是 60s
  2. request、uploadFile、downloadFile 的最大并发限制是 10 个
  3. 网络请求的 referer header 不可设置。其格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本。
  4. 小程序进入后台运行后(非置顶聊天),如果 5s 内网络请求没有结束,会回调错误信息 fail interrupted;在回到前台之前,网络请求接口调用都会无法调用。

有时候业务上需要同时请求10个以上的链接,针对这种情况需要延迟后续的请求,等当前请求完结后再去执行后续的请求

解决思路

达到并发限制数量之后,延迟之后的请求,待之前的请求结束,再去发送之前延迟的请求
  1. 缓存当前请求的数量

    // 使用闭包缓存当前的请求量
    var req = (function(){
        var count = 0;
        var counter = function() {
            count--;
        };
        return function(fn) {
            if (count < 10) {
                count++;
                fn(counter);
            } else {
                setTimeout(req.bind(null, fn), 300);
            }
        };
    })()
  2. 模拟20个异步事件

    var a = function(fn){
        // 假设所有的异步事件都是2s后完成 
        setTimeout(()=>{
            console.log(new Date().getTime().toString().slice(-4))
            // 此处fn是req中的counter,在异步事件执行之后,释放其所占用的count
            fn()
        },2000)
       }
    var b = Array.from({length:20});
    
    b.map(()=>req(a))
  3. 结果验证
    图片描述

    可以看到前10个请求与后十个请求是间隔2s之后才发出的,即将请求十个一组分开,这样就避免了10个并发请求限制下,请求丢失的问题


Feliks
120 声望0 粉丝