记录接口队列的顺序执行

53 阅读1分钟

记录在工作中碰到的问题,同接口同时多次触发(不同参数),因带宽等多种原因导致后端处理顺序打乱,最终入库数据不对。 自己想了一个发起接口队列的方式来解决这种问题,有什么好的思路方法希望掘友多多评论!

// 队列
var queue = [];
// 为了唤起第一次循环
var first = null;

// 模拟触发300发起一次请求
var timer = null;
timer = setInterval(() => {
  console.log('发起了一个请求')
	queue.push('请求参数:'+ Math.random())
  if(!first) {
    first = '开始'
    firstEvent();
  }
}, 300)

// 3秒后停止发起请求
setTimeout(() => {
  console.log(timer, '我来关闭发起')
	if(timer) {
    clearInterval(timer)
    timer = null
  }
}, 3000)

// 请求接口
function request(params) {
  return new Promise(resolve => {
      // 模式每次接口处理需要1000毫秒
      console.log('请求处理开始')
      setTimeout(() => {
        console.log('处理了一个请求:'+ new Date().toLocaleTimeString() + ',params:' + params)
        queue.shift()
        resolve()
      }, 1000)
  })
}
// 唤起方法
var firstEvent = async () => {
  // 队列循环
  console.log('queue', queue.length)
  while ( queue.length > 0 ) {
    await request(queue[0])
  }
}