teamviewer 使用数量到达上限_使用 Promise 实现任务队列发送请求,实现最大请求数目限制...

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  一只菜鸟攻城狮啊 

来源 |  urlify.cn/RBrIbu

66套java从入门到精通实战课程分享 

核心

  • 设置最大请求数量,当前请求数量,待执行队列

  • 调用时,创建一个新任务,然后判断是否达到最大请求数量,若达到则将任务追加到待执行队列,否则,则直接执行该任务。并返回Promise

  • 创建任务时,需要返回一个函数,当该任务开始执行则当前数量加一。当任务执行完毕时使用finally,当前数量减一,并从待执行队列中取出新任务执行

实现

class limitPromise{
    constructor(max){
    this.max = max;
    this._count = 0;
    this._pendingTaskQueue = [];
  }
   /**
   * 调用器,将异步任务函数和它的参数传入
   * @param caller 异步任务函数,返回Promise的函数
   * @param args 异步任务函数的参数列表
   * @returns {Promise} 返回一个新的Promise
   */
  call = (caller, ...arg) => {return new Promise((resolve, reject) => {let task = this._createTask(caller, arg, resolve, reject);if(this._count >= this.max) {
        this._pendingTaskQueue.push();
        }else{
        task();
        }
    });
    }
   /**
   * 创建一个任务
   * @param caller 实际执行的函数
   * @param args 执行函数的参数
   * @param resolve
   * @param reject
   * @returns {Function} 返回一个任务函数
   * @private
   */
     _createTask = (caller, arg, resolve, reject)=> {return () => {
       // 当前请求数量加一
       this._count++;
       // 实际上是在这里调用了异步任务,并将异步任务的返回(resolve和reject)抛给了上层caller(...arg)
         .then(resolve)
         .catch(reject)
         .finally(() => {
                // 任务队列的消费区,利用Promise的finally方法,在异步任务结束后,取出下一个任务执行
                this._count--;if(this._pendingTaskQueue.length){let task = this._pendingTaskQueue.shift();
                task();
                } 
        })
     }
   }
}

使用

假设我们有一个网络请求模块,叫request.js,包含get和post方法,一般情况下,是这样使用的

const request = require('./request')
request.get('https://www.baidu.com')
  .then((res) => {
    // 处理返回结果
  })
  .catch(err => {
    // 处理异常情况
  })

现在我们要把它改造成受限制的网络请求,假设请求上限设为10个,并起名叫limitRequest.js。实现如下:

const LimitPromise = require('limit-promise')
const request = require('./request')
// 请求上限
const MAX = 10
// 核心控制器
const limitP = new LimitPromise(MAX)

// 利用核心控制器包装request中的函数
function get (url, params) {
  return limitP.call(request.get, url, params)
}
function post (url, params) {
  return limitP.call(request.post, url, params)
}
// 导出
module.exports = {get, post}

这里就完成受限请求模块的构建了,是不是很简单,而且调用接口完全没变,只需要引入limitRequest.js替代原先的即可。

8480d65818cf712414adc8c8c3eeced0.gif

b38f63fd3470af1d5359ddf361852947.gif

  • 新款SpringBoot在线教育平台开源了

  • 啃了这66套Java项目课程后,终于找到工作了!

  • 精品帖子大汇总

  • 牛逼plus,Spring Boot-Shiro-Vue权限系统(细粒度控制到按钮)

感谢点赞支持下哈 fad75befd02fbd40ad876d62ac303784.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值