js如何限制请求并发数?promise

时间: 作者:admin 浏览:
/**
 * @method 限制请求并发数
 * @param {Object} options -参数
 * @property {Array} options.tasks -promise请求方法队列数组:[this.$api.user.getUserInfo, this.$api.sys.getSystemTime, this.$api.dict.getDicts, ...]
 * @property {Number} options.limit -最大并发数
 * @property {Boolean} options.isAuto -是否自动开始执行 = true 自动立刻执行 | false 则需要手动执行:new LimitConcurrency(options).runQueue() 
 * @property {Function} options.callback -每次执行完的回调
 * @property {Function} options.finallys -全部执行完的回调
 * @example:
    const tasks = [this.$api.user.getUserInfo, this.$api.sys.getSystemTime, this.$api.dict.getDicts, 666]
    const callback = (res, index ,task)=>{console.log(res, index ,task)}
    const finallys = ()=>{console.log("allFinished")}
    let con = new LimitConcurrentcy({tasks, limit: 3, isAuto: true, callback, finallys})
 */
 export class LimitConcurrentcy {
     constructor(options){
        let defaults = {
            tasks: [],
            limit: 3,
            isAuto: true,
            callback: undefined,
            finallys: undefined
        }
        options = Object.assign({}, defaults, options || {})
        this.tasks = options.tasks.slice()
        this.queue = new Set()
        this.limit = options.limit
        this.index = -1
        this.count = -1
        this.callback = options.callback
        this.finallys = options.finallys

        options.isAuto && this.runQueue()
    }
    runQueue(){
        if(this.tasks.length === 0 && this.queue.size === 0 && this.count === this.index){
            this.isFunction(this.finallys) && this.finallys()
        }
        while(this.tasks.length > 0 && this.queue.size < this.limit){
            const task = this.tasks.shift()
            this.index++
            this.queue.add(task)
            if(!this.isFunction(task)){
                this.currentFinally(null, this.index, task)
                continue
            }
            this.runTask(task, this.index)
        }
    }
    runTask(task, index){
        //这里也可以直接用finally()回调代替,小编这里是为了兼容旧版本浏览器
        task().then((res)=>{
            this.currentFinally(res, index, task)
        }).catch((err)=>{
            this.currentFinally(err, index, task)
        })
    }
    isFunction(obj){
        return typeof obj === 'function' && Object.prototype.toString.call(obj) === '[object Function]'
    }
    runCallback(res, index ,task){
        this.isFunction(this.callback) && this.callback(res, index, task)
    }
    currentFinally(res, index, task){
        this.queue.delete(task)
        this.runCallback(res, index, task)
        this.count++

        this.runQueue()
    }
    addTask(...task){
        /**
        *@method 实例增加任务队列:con.addTask(...task)
        * @params {Array | Function} ...task -接受多参数:数组或者数组扩展或者单、多个function
        */
        if(Array.isArray(...task)){
            this.tasks = this.tasks.concat(...task)
        }else{
            this.tasks.push(...task)
        }
        this.runQueue()
    }
 }
微信公众号
微信公众号:
  • 前端全栈之路(微信群)
前端QQ交流群
前端QQ交流群:
  • 794324979
  • 734802480(已满)

更多文章

栏目文章


Copyright © 2014-2023 seozhijia.net 版权所有-粤ICP备13087626号-4