Promise并发限量

330 阅读1分钟

背景介绍

当我们的一个页面有大量的请求,将用到并发请求,如何实现循环请求,限量并发是我们这次讨论的重点,下面一张表格表示各大浏览器的最大并发连接数目,对于大文件上传也是必不可少的。

浏览器HTTP / 1.1HTTP / 1.0
IE 1166
火狐66
Safari 3,444
Chrome 4+66
iphone56?
Android2-44?

代码实现

// 看着是否很眼熟,参考的是vue的watcher类的实现
class Scheduler {
    constructor(limit){
    	// 最大并发量
        this.maxCount = limit
        // 所有需要发送的请求,添加到数组
        this.list = []
        // 记录当前正在请求的promise数量
        this.temRunIndex = 0
    }
    // 添加异步请求
    add(promiseCreator) {
        this.list.push(promiseCreator)
    }
    // 开始发送请求
    taskStart(callback) {
    	this.callback = callback
        for(let i = 0;i<this.maxCount;i++) {
            this.request()
        }
    }
    // 递归调用
    request() {
        // 边界值
        if(!this.list || !this.list.length || this.temRunIndex >= this.maxCount) return
        this.temRunIndex++
        this.list.shift()()
            .then(res => {
				//...doing
                this.callback && this.callback(res)
            }).catch(err=>{
				//...doing
            }).finally(res=>{
                this.temRunIndex--
                this.request()
            })
    }
}

function ajax(time) {
    return new Promise(resolve => {
        setTimeout(resolve, time)
    })
}

var scheduler = new Scheduler(2)
function addTask(time, order) {
    scheduler.add(()=> ajax(time).then(()=>console.log(order)))
}

addTask(1000, 1)
addTask(500, 2)
addTask(300, 3)
addTask(400, 4)
scheduler.taskStart()
// scheduler.taskStart((data)=>{
	// 对返回的数据做一些处理
// })

结束

感谢大家的利用宝贵时间,阅读这篇文章,对您产生帮助,不要忘了点赞喔😯

参考资料

my.oschina.net/u/4676704/b…